C#:
// Все права принадлежат дискорд сообществу https://discord.gg/VgNHPpNrz6
using System;
using System.Collections.Generic;
using UnityEngine;
using Newtonsoft.Json;
using Oxide.Core;
using Oxide.Core.Configuration;
using Oxide.Core.Libraries.Covalence;
using Oxide.Game.Rust.Cui;
namespace Oxide.Plugins {
[Info("UI Scale Manager", "noname", "2.2.2")]
[Description("User's UIScale data is stored and provided by API")]
class UIScaleManager : CovalencePlugin {
#region Field
private delegate string LangDelegate(string key, string id = null, params object[] args);
private static LangDelegate _langGlobal;
private static VersionNumber _pluginVersion;
private const float _defaultUIScale = 1.0f;
private const int _defaultAspectRatioIndicator = 2;
private static AspectRatioRaw[] _ratioPresets;
private static int _defaultAspectRatioX;
private static int _defaultAspectRatioY;
private DataManager _dataManager;
private UIController _uiController;
private UIGenerator.UIScaler _uiScaler;
private Dictionary<string, float[]> _playerUIInfoCache;
private struct AspectRatioRaw {
public int X {
get;
set;
}
public int Y {
get;
set;
}
public AspectRatioRaw(int x, int y) {
X = x;
Y = y;
}
}
#endregion
#region Hooks
protected override void LoadDefaultConfig() {
PrintWarning("Creating a new configuration file");
Config.WriteObject(GetDefaultConfig(), true);
}
private void Init() {
_langGlobal = Lang;
_pluginVersion = this.Version;
_ratioPresets = new AspectRatioRaw[] {
new AspectRatioRaw(4, 3), new AspectRatioRaw(5, 4), new AspectRatioRaw(16, 9), new AspectRatioRaw(17, 9), new AspectRatioRaw(16, 10), new AspectRatioRaw(21, 9), new AspectRatioRaw(32, 9), new AspectRatioRaw(32, 10)
}
;
_defaultAspectRatioX = _ratioPresets[_defaultAspectRatioIndicator].X;
_defaultAspectRatioY = _ratioPresets[_defaultAspectRatioIndicator].Y;
_dataManager = new DataManager();
_uiController = new UIController();
_uiScaler = _uiController.UIScaler;
_playerUIInfoCache = new Dictionary<string, float[]>();
LoadConfig();
var Result = _dataManager.LoadPlayersData();
if (Result == DataManager.LoadResult.Updated) Puts("DataFile version has been updated");
}
private void OnServerInitialized() {
if (config.InitPlayer) {
foreach (BasePlayer player in BasePlayer.activePlayerList) {
if (!_dataManager.Data.Players.ContainsKey(player.UserIDString)) _uiController.OpenUI(player, _defaultAspectRatioX, _defaultAspectRatioY, _defaultUIScale);
}
}
}
void OnServerSave() {
_dataManager.SavePlayersData();
Puts("Saving UIScaleManager PlayersDataFile...");
}
void Unload() {
foreach (BasePlayer player in BasePlayer.activePlayerList) _uiController.CloseUI(player);
_dataManager.SavePlayersData();
}
private void OnPlayerSleepEnded(BasePlayer player) {
if (config.InitPlayer) {
timer.Once(1f, () => {
if (!_dataManager.Data.Players.ContainsKey(player.UserIDString)) _uiController.OpenUI(player, _defaultAspectRatioX, _defaultAspectRatioY, _defaultUIScale);
}
);
}
}
private void OnUserDisconnected(IPlayer player) {
_uiController.CloseUI(player.Object as BasePlayer);
}
#endregion
#region ConfigManage
private PluginConfig config;
private void LoadConfig() {
config = Config.ReadObject<PluginConfig>();
if (config == null) config = GetDefaultConfig();
VersionUpdate(config);
}
private void VersionUpdate(PluginConfig config) {
// if (config.ConfigVersion < new VersionNumber(2, 1, 0))
// {
// config.ConsoleFilter = GetDefaultConsoleFilter();
// }
if (config.ConfigVersion < this.Version) {
config.ConfigVersion = this.Version;
Config.WriteObject(config, true);
Puts("Config version has been updated");
}
}
private class PluginConfig {
public bool InitPlayer;
public VersionNumber ConfigVersion;
}
private PluginConfig GetDefaultConfig() {
return new PluginConfig {
InitPlayer = true, ConfigVersion = _pluginVersion
}
;
}
#endregion
#region LangManage
protected override void LoadDefaultMessages() {
lang.RegisterMessages(new Dictionary<string, string> {
["UI Scale Data Changed"]
= "Your UI data is setted to {0} {1}:{2}.", ["Cancel"] = "Canceled.", ["Error"] = "Unexpected Parameter.", ["YourCurrentAspectRatio"] = "Your Current Aspect Ratio Is", ["YourCurrentUISize"] = "Your Current UI Size Is", ["FitBelt"] = "<color=yellow>Please fit this rectangle to the item belt</color>", ["FitStatusW"] = "<color=yellow>Please fit this rectangle to the status window</color>"
}
, this);
lang.RegisterMessages(new Dictionary<string, string> {
["UI Scale Data Changed"]
= "UI 데이터가 사이즈 {0}, 화면비율 {1}:{2} 로 저장되었습니다.", ["Cancel"] = "취소되었습니다.", ["Error"] = "예상치 못한 파라미터입니다.", ["YourCurrentAspectRatio"] = "화면비율 설정", ["YourCurrentUISize"] = "UI 사이즈 설정", ["FitBelt"] = "<color=yellow>이 사각형을 아이템벨트에 맞춰주세요</color>", ["FitStatusW"] = "<color=yellow>이 사각형을 상태창에 맞춰주세요</color>"
}
, this, "ko");
}
private string Lang(string key, string id = null, params object[] args) {
return string.Format(lang.GetMessage(key, this, id), args);
}
#endregion
#region DataManage
public class DataManager {
public DataFile Data;
private DynamicConfigFile _dynamicConfigFile;
public DataManager() {
_dynamicConfigFile = Interface.Oxide.DataFileSystem.GetDatafile("UIScaleManagerPlayerData");
}
public LoadResult LoadPlayersData() {
Data = _dynamicConfigFile.ReadObject<DataFile>();
if (Data == null) Data = new DataFile();
return VersionUpdate();
}
public void SavePlayersData() {
_dynamicConfigFile.WriteObject<DataFile>(Data);
}
private LoadResult VersionUpdate() {
if (Data.DataVersion < _pluginVersion) {
Data = new DataFile();
_dynamicConfigFile.WriteObject<DataFile>(Data);
return LoadResult.Updated;
}
return LoadResult.Ok;
}
public enum LoadResult {
Ok, Updated
}
public class DataFile {
public Dictionary<string, UIStatus> Players;
//is readonly but Jsonserialize...public VersionNumber DataVersion;
public DataFile() {
Players = new Dictionary<string, UIStatus>();
Players = Players;
DataVersion = _pluginVersion;
}
public void AddPlayerData(IPlayer player) {
var uiStatus = new UIStatus(player);
Players.Add(player.Id, uiStatus);
}
public void AddPlayerData(IPlayer player, float uiscale, int RatioIndicator) {
var uiStatus = new UIStatus(player, uiscale, RatioIndicator);
Players.Add(player.Id, uiStatus);
}
public class UIStatus {
public string Name {
get;
set;
}
[JsonIgnore]
public float UIScale {
get {
return _uiScale;
}
set {
if (value < 0.5) value = 0.5f;
else if (1.0f < value) value = 1.0f;
value = (float)Math.Round(value, 7);
_uiScale = value;
}
}
/// <summary>
/// DO NOT USE IT
/// </summary>
[JsonProperty("UIScale")]
public float _uiScale;
[JsonProperty("AspectRatio")]
public AspectRatio Ratio {
get;
set;
}
/// <summary>
/// DO NOT USE IT
/// </summary>
public UIStatus() {
//for json serialize
}
public UIStatus(IPlayer player) {
Name = player.Name;
UIScale = _defaultUIScale;
Ratio = new AspectRatio(_defaultAspectRatioIndicator);
}
public UIStatus(IPlayer player, float uiscale, int AspectRatioIndicator) {
Name = player.Name;
UIScale = uiscale;
Ratio = new AspectRatio(AspectRatioIndicator);
}
public class AspectRatio {
[JsonIgnore]
public int Indicator {
get {
return _indicator;
}
set {
if (value < 0) {
value = Mathf.Abs(value) % _ratioPresets.Length;
value = _ratioPresets.Length - 1;
if (value == _ratioPresets.Length) value -= 1;
}
else value %= _ratioPresets.Length;
_indicator = value;
AspectRatioRaw aspectRatioRaw = _ratioPresets[_indicator];
X = aspectRatioRaw.X;
Y = aspectRatioRaw.Y;
}
}
/// <summary>
/// DO NOT USE IT
/// </summary>
[JsonProperty("Indicator")]
public int _indicator;
/// <summary>
/// DO NOT SET IT
/// </summary>
public int X;
/// <summary>
/// DO NOT SET IT
/// </summary>
public int Y;
public AspectRatio() {
Indicator = _defaultAspectRatioIndicator;
}
public AspectRatio(int indicator) {
Indicator = indicator;
}
}
}
}
}
#endregion
#region Command
[Command("UIScaleManager.control")]
void SetUIScaleCommand(IPlayer player, string command, string[] args) {
if (player.IsServer) return;
var bPlayer = player.Object as BasePlayer;
if (args.Length >= 1) {
if (args[0] == "ratio") {
if (args.Length >= 2) {
int parsedResult;
if (int.TryParse(args[1], out parsedResult) == false) player.Message(Lang("Error", player.Id));
else {
DataManager.DataFile.UIStatus playerinfo;
if (!_dataManager.Data.Players.ContainsKey(player.Id)) {
_dataManager.Data.AddPlayerData(player, _defaultUIScale, _defaultAspectRatioIndicator + parsedResult);
playerinfo = _dataManager.Data.Players[player.Id];
}
else {
playerinfo = _dataManager.Data.Players[player.Id];
playerinfo.Ratio.Indicator += parsedResult;
}
_uiController.UpdateDisplayAspectRatio(bPlayer, playerinfo.Ratio.X, playerinfo.Ratio.Y, playerinfo.UIScale);
player.Message(Lang("UI Scale Data Changed", player.Id, playerinfo.UIScale, playerinfo.Ratio.X, playerinfo.Ratio.Y));
if (_playerUIInfoCache.ContainsKey(player.Id)) _playerUIInfoCache.Remove(player.Id);
Interface.CallHook("OnUIScaleChanged", player, playerinfo.UIScale, playerinfo.Ratio.X, playerinfo.Ratio.Y);
}
}
else player.Message(Lang("Error", player.Id));
}
else if (args[0] == "size") {
if (args.Length >= 2) {
float parsedResult;
if (float.TryParse(args[1], out parsedResult) == false) {
player.Message(Lang("Error", player.Id));
}
else {
DataManager.DataFile.UIStatus playerinfo;
if (!_dataManager.Data.Players.ContainsKey(player.Id)) {
_dataManager.Data.AddPlayerData(player, _defaultUIScale + parsedResult, _defaultAspectRatioIndicator);
playerinfo = _dataManager.Data.Players[player.Id];
}
else {
playerinfo = _dataManager.Data.Players[player.Id];
playerinfo.UIScale += parsedResult;
}
_uiController.UpdateDisplayUISize(bPlayer, playerinfo.Ratio.X, playerinfo.Ratio.Y, playerinfo.UIScale);
player.Message(Lang("UI Scale Data Changed", player.Id, playerinfo.UIScale, playerinfo.Ratio.X, playerinfo.Ratio.Y));
if (_playerUIInfoCache.ContainsKey(player.Id)) _playerUIInfoCache.Remove(player.Id);
Interface.CallHook("OnUIScaleChanged", player, playerinfo.UIScale, playerinfo.Ratio.X, playerinfo.Ratio.Y);
}
}
else player.Message(Lang("Error", player.Id));
}
else player.Message(Lang("Error", player.Id));
}
else {
if (!_dataManager.Data.Players.ContainsKey(player.Id)) {
_dataManager.Data.AddPlayerData(player);
player.Message(Lang("UI Scale Data Changed", player.Id, _defaultUIScale, _defaultAspectRatioX, _defaultAspectRatioY));
if (_playerUIInfoCache.ContainsKey(player.Id)) _playerUIInfoCache.Remove(player.Id);
Interface.CallHook("OnUIScaleChanged", player, _defaultUIScale, _defaultAspectRatioX, _defaultAspectRatioY);
_uiController.CloseUI(bPlayer);
}
else {
_uiController.CloseUI(bPlayer);
}
}
}
[Command("setui")]
void SetUIScaleOpenCommand(IPlayer player, string command, string[] args) {
if (player.IsServer) return;
var bPlayer = player.Object as BasePlayer;
if (!_dataManager.Data.Players.ContainsKey(player.Id)) _uiController.OpenUI(bPlayer, _defaultAspectRatioX, _defaultAspectRatioY, _defaultUIScale);
else {
var playerinfo = _dataManager.Data.Players[player.Id];
_uiController.OpenUI(bPlayer, playerinfo.Ratio.X, playerinfo.Ratio.Y, playerinfo.UIScale);
}
}
#endregion
#region API
private float[] API_CheckPlayerUIInfo(string playerID) {
if (_playerUIInfoCache.ContainsKey(playerID)) return _playerUIInfoCache[playerID];
else if (_dataManager.Data.Players.ContainsKey(playerID)) {
var uIStatus = _dataManager.Data.Players[playerID];
float[] playerinfo = new float[] {
uIStatus.Ratio.X, uIStatus.Ratio.Y, uIStatus.UIScale
}
;
_playerUIInfoCache.Add(playerID, playerinfo);
return playerinfo;
}
else return null;
}
private float[] API_GetItemBeltAnchor(int ratioX, int ratioY, float uiSize) {
var dscalingParameter = new UIGenerator.UIScaler.DScalingParameter(ratioX, ratioY, uiSize);
if (_uiController.UIScaler.ItemBeltResultCache.ContainsKey(dscalingParameter)) return _uiScaler.ItemBeltResultCache[dscalingParameter].Result;
else {
_uiScaler.ItemBeltScaleCaching(ratioX, ratioY, uiSize);
return _uiScaler.ItemBeltResultCache[dscalingParameter].Result;
}
}
private float[] API_GetItemBeltAnchor(string playerID) {
if (_dataManager.Data.Players.ContainsKey(playerID)) {
var uIStatus = _dataManager.Data.Players[playerID];
return API_GetItemBeltAnchor(uIStatus.Ratio.X, uIStatus.Ratio.Y, uIStatus.UIScale);
}
else return null;
}
private float[] API_GetStatusWindowAnchor(int ratioX, int ratioY, float uiSize) {
var dscalingParameter = new UIGenerator.UIScaler.DScalingParameter(ratioX, ratioY, uiSize);
if (_uiController.UIScaler.StatusWindowResultCache.ContainsKey(dscalingParameter)) return _uiScaler.StatusWindowResultCache[dscalingParameter].Result;
else {
_uiScaler.StatusWindowScaleCaching(ratioX, ratioY, uiSize);
return _uiScaler.StatusWindowResultCache[dscalingParameter].Result;
}
}
private float[] API_GetStatusWindowAnchor(string playerID) {
if (_dataManager.Data.Players.ContainsKey(playerID)) {
var uIStatus = _dataManager.Data.Players[playerID];
return API_GetStatusWindowAnchor(uIStatus.Ratio.X, uIStatus.Ratio.Y, uIStatus.UIScale);
}
else return null;
}
private float[] API_AutoAnchorScaling(float anchorMinX, float anchorMinY, float anchorMaxX, float anchorMaxY, int center, int parent, int ratioX, int ratioY, float uiSize) {
var scalingResult = _uiScaler.UniversalPanelScaling(new UIGenerator.StackRectAnchor(anchorMinX, anchorMinY, anchorMaxX, anchorMaxY), (UIGenerator.RootRectAnchor.RectCenter)center, (UIGenerator.UIScaler.ScalingParent)parent, ratioX, ratioY, uiSize);
return scalingResult.Result;
}
private float[] API_AutoAnchorScaling(float anchorMinX, float anchorMinY, float anchorMaxX, float anchorMaxY, int center, int parent, string playerID) {
if (_dataManager.Data.Players.ContainsKey(playerID)) {
var uiStatus = _dataManager.Data.Players[playerID];
return API_AutoAnchorScaling(anchorMinX, anchorMinY, anchorMaxX, anchorMaxY, center, parent, uiStatus.Ratio.X, uiStatus.Ratio.Y, uiStatus.UIScale);
}
else return null;
}
#endregion
#region UI
public class UIController {
public UIGenerator.UIScaler UIScaler {
get {
return _uiGenerator.Scaler;
}
}
private UIGenerator _uiGenerator;
private List<string> _uiUsers;
public UIController() {
_uiGenerator = new UIGenerator();
_uiUsers = new List<string>();
}
public void OpenUI(BasePlayer player, int ratioX, int ratioY, float uiSize) {
if (_uiUsers.Contains(player.UserIDString)) return;
_uiUsers.Add(player.UserIDString);
_uiGenerator.UIInit(player);
_uiGenerator.DrawAspectRatioLabel(player, ratioX, ratioY);
_uiGenerator.DrawSizeLabel(player, uiSize);
_uiGenerator.DrawUIGuidePanel(player, ratioX, ratioY, uiSize);
}
public void CloseUI(BasePlayer player) {
if (!_uiUsers.Contains(player.UserIDString)) return;
_uiGenerator.DestroyMainUI(player);
_uiUsers.Remove(player.UserIDString);
}
public void UpdateDisplayAspectRatio(BasePlayer player, int ratioX, int ratioY, float uiSize) {
if (!_uiUsers.Contains(player.UserIDString)) return;
_uiGenerator.DestroyAspectRatioLabel(player);
_uiGenerator.DrawAspectRatioLabel(player, ratioX, ratioY);
_uiGenerator.DestoryUIGuidePanel(player);
_uiGenerator.DrawUIGuidePanel(player, ratioX, ratioY, uiSize);
}
public void UpdateDisplayUISize(BasePlayer player, int ratioX, int ratioY, float uiSize) {
if (!_uiUsers.Contains(player.UserIDString)) return;
_uiGenerator.DestroySizeLabel(player);
_uiGenerator.DrawSizeLabel(player, uiSize);
_uiGenerator.DestoryUIGuidePanel(player);
_uiGenerator.DrawUIGuidePanel(player, ratioX, ratioY, uiSize);
}
}
public class UIGenerator {
public UIScaler Scaler;
private const string _main = "USM_Main";
private const string _mainInner = "USM_MainInner";
private const string _innerUp = "USM_InnerUp";
private const string _innerDown = "USM_InnerDown";
private const string _ratioLabel = "USM_RatioLabel";
private const string _sizeLabel = "USM_SizeLabel";
private const string _rButtonRatioPanel = "USM_RButtonRatioPanel";
private const string _lButtonRatioPanel = "USM_LButtonRatioPanel";
private const string _rButtonSizePanel = "USM_RButtonSizePanel";
private const string _lButtonSizePanel = "USM_LButtonSizePanel";
private const string _itemBeltPanel = "USM_ItemBeltPanel";
private const string _statusWindowPanel = "USM_StatusWindowPanel";
public const float UnitCorrection = 0.0031f;
private static float _xunit;
private static float _yunit;
private readonly UniversalRectAnchor _mainInnerPanelAnchor;
private readonly UniversalRectAnchor _innerUpPanelAnchor;
private readonly UniversalRectAnchor _innerDownPanelAnchor;
private readonly UniversalRectAnchor _cLabelAnchor;
private readonly UniversalRectAnchor _valueLabelAnchor;
private readonly UniversalRectAnchor _rButtonPanel;
private readonly UniversalRectAnchor _lButtonPanel;
private readonly UniversalRectAnchor _buttonAnchor;
private static UniversalRectAnchor _itemBeltAnchor;
private static UniversalRectAnchor _statusWindowAnchor;
private readonly UniversalRectAnchor _textPadding;
public UIGenerator() {
Scaler = new UIScaler();
_xunit = _defaultAspectRatioY * 0.01f;
_yunit = _defaultAspectRatioX * 0.01f;
_mainInnerPanelAnchor = new UniversalRectAnchor((_xunit * 5) - UnitCorrection, (_yunit * 4) - UnitCorrection);
_mainInnerPanelAnchor.AlignCenterX();
_mainInnerPanelAnchor.AlignCenterY();
_mainInnerPanelAnchor.MoveY(_yunit / 2);
_innerUpPanelAnchor = new UniversalRectAnchor(0, 0.5f, 1 - UnitCorrection, 1.0f - UnitCorrection);
_innerDownPanelAnchor = new UniversalRectAnchor(0, 0, 1 - UnitCorrection, 0.5f - UnitCorrection);
_cLabelAnchor = new UniversalRectAnchor(0, 0, 1, 0.2f - UnitCorrection);
_cLabelAnchor.MoveYEnd();
_valueLabelAnchor = new UniversalRectAnchor(0, 0, 0.601f, 0.8f - UnitCorrection);
_valueLabelAnchor.AlignCenterX();
_rButtonPanel = new UniversalRectAnchor(0, 0, 0.2f - UnitCorrection, 0.8f - UnitCorrection);
_rButtonPanel.MoveXEnd();
_lButtonPanel = new UniversalRectAnchor(0, 0, 0.2f - UnitCorrection, 0.8f - UnitCorrection);
_buttonAnchor = new UniversalRectAnchor(0.9f, 0.9f);
_buttonAnchor.AlignCenterX();
_buttonAnchor.AlignCenterY();
_itemBeltAnchor = new UniversalRectAnchor(0.312f, 0.082f);
_statusWindowAnchor = new UniversalRectAnchor(0.149f, 0.112f);
_textPadding = new UniversalRectAnchor(0.9f, 0.9f);
_textPadding.AlignCenterX();
_textPadding.AlignCenterY();
}
public void UIInit(BasePlayer player) {
CuiElementContainer UIInstance = new CuiElementContainer();
string CRatio = _langGlobal("YourCurrentAspectRatio", player.UserIDString);
string CUISize = _langGlobal("YourCurrentUISize", player.UserIDString);
//////////////////////////////////////////////////////////mainUI
UIInstance.Add(new CuiPanel {
CursorEnabled = true, Image = {
Color = "0 0 0 0"
}
, RectTransform = {
AnchorMin = "0 0", AnchorMax = "1 1"
}
,
}
, "Overlay", _main);
UIInstance.Add(new CuiButton {
RectTransform = {
AnchorMin = "0 0", AnchorMax = "1 1"
}
, Button = {
Color = "0 0 0 0", Command = "UIScaleManager.control"
}
, Text = {
Text = "", FontSize = 13, Align = TextAnchor.MiddleCenter
}
}
, _main);
UIInstance.Add(new CuiPanel {
CursorEnabled = true, Image = {
Color = "0 0 0 0.5"
}
, RectTransform = {
AnchorMin = _mainInnerPanelAnchor.AnchorMin, AnchorMax = _mainInnerPanelAnchor.AnchorMax
}
,
}
, _main, _mainInner);
////////////////////////////////////////InnerUp
UIInstance.Add(new CuiPanel {
CursorEnabled = true, Image = {
Color = "0 0 0 0"
}
, RectTransform = {
AnchorMin = _innerUpPanelAnchor.AnchorMin, AnchorMax = _innerUpPanelAnchor.AnchorMax
}
,
}
, _mainInner, _innerUp);
UIInstance.Add(new CuiPanel {
CursorEnabled = true, Image = {
Color = "0 0 0 0.5"
}
, RectTransform = {
AnchorMin = _cLabelAnchor.AnchorMin, AnchorMax = _cLabelAnchor.AnchorMax
}
,
}
, _innerUp);
UIInstance.Add(new CuiLabel {
Text = {
Text = CRatio, FontSize = 25, Align = TextAnchor.MiddleCenter
}
, RectTransform = {
AnchorMin = _cLabelAnchor.AnchorMin, AnchorMax = _cLabelAnchor.AnchorMax
}
}
, _innerUp);
UIInstance.Add(new CuiPanel {
CursorEnabled = true, Image = {
Color = "0 0 0 0"
}
, RectTransform = {
AnchorMin = _lButtonPanel.AnchorMin, AnchorMax = _lButtonPanel.AnchorMax
}
,
}
, _innerUp, _lButtonRatioPanel);
UIInstance.Add(new CuiPanel {
CursorEnabled = true, Image = {
Color = "0 0 0 0"
}
, RectTransform = {
AnchorMin = _rButtonPanel.AnchorMin, AnchorMax = _rButtonPanel.AnchorMax
}
,
}
, _innerUp, _rButtonRatioPanel);
UIInstance.Add(new CuiButton {
RectTransform = {
AnchorMin = _buttonAnchor.AnchorMin, AnchorMax = _buttonAnchor.AnchorMax
}
, Button = {
Color = "0 0 0 0", Command = "UIScaleManager.control ratio -1"
}
, Text = {
Text = "<", FontSize = 50, Align = TextAnchor.MiddleCenter
}
}
, _lButtonRatioPanel);
UIInstance.Add(new CuiButton {
RectTransform = {
AnchorMin = _buttonAnchor.AnchorMin, AnchorMax = _buttonAnchor.AnchorMax
}
, Button = {
Color = "0 0 0 0", Command = "UIScaleManager.control ratio 1"
}
, Text = {
Text = ">", FontSize = 50, Align = TextAnchor.MiddleCenter
}
}
, _rButtonRatioPanel);
////////////////////////////////////////InnerUp
////////////////////////////////////////InnerDown
UIInstance.Add(new CuiPanel {
CursorEnabled = true, Image = {
Color = "0 0 0 0"
}
, RectTransform = {
AnchorMin = _innerDownPanelAnchor.AnchorMin, AnchorMax = _innerDownPanelAnchor.AnchorMax
}
,
}
, _mainInner, _innerDown);
UIInstance.Add(new CuiPanel {
CursorEnabled = true, Image = {
Color = "0 0 0 0.5"
}
, RectTransform = {
AnchorMin = _cLabelAnchor.AnchorMin, AnchorMax = _cLabelAnchor.AnchorMax
}
,
}
, _innerDown);
UIInstance.Add(new CuiLabel {
Text = {
Text = CUISize, FontSize = 25, Align = TextAnchor.MiddleCenter
}
, RectTransform = {
AnchorMin = _cLabelAnchor.AnchorMin, AnchorMax = _cLabelAnchor.AnchorMax
}
}
, _innerDown);
UIInstance.Add(new CuiPanel {
CursorEnabled = true, Image = {
Color = "0 0 0 0"
}
, RectTransform = {
AnchorMin = _lButtonPanel.AnchorMin, AnchorMax = _lButtonPanel.AnchorMax
}
,
}
, _innerDown, _lButtonSizePanel);
UIInstance.Add(new CuiPanel {
CursorEnabled = true, Image = {
Color = "0 0 0 0"
}
, RectTransform = {
AnchorMin = _rButtonPanel.AnchorMin, AnchorMax = _rButtonPanel.AnchorMax
}
,
}
, _innerDown, _rButtonSizePanel);
UIInstance.Add(new CuiButton {
RectTransform = {
AnchorMin = _buttonAnchor.AnchorMin, AnchorMax = _buttonAnchor.AnchorMax
}
, Button = {
Color = "0 0 0 0", Command = "UIScaleManager.control size -0.1"
}
, Text = {
Text = "<", FontSize = 50, Align = TextAnchor.MiddleCenter
}
}
, _lButtonSizePanel);
UIInstance.Add(new CuiButton {
RectTransform = {
AnchorMin = _buttonAnchor.AnchorMin, AnchorMax = _buttonAnchor.AnchorMax
}
, Button = {
Color = "0 0 0 0", Command = "UIScaleManager.control size 0.1"
}
, Text = {
Text = ">", FontSize = 50, Align = TextAnchor.MiddleCenter
}
}
, _rButtonSizePanel);
////////////////////////////////////////InnerDown
////////////////////////////////////////////////////////mainUI
CuiHelper.AddUi(player, UIInstance);
}
public void DestroyMainUI(BasePlayer player) {
CuiHelper.DestroyUi(player, _main);
}
public void DrawAspectRatioLabel(BasePlayer player, int ratioX, int ratioY) {
CuiElementContainer UIInstance = new CuiElementContainer();
UIInstance.Add(new CuiLabel {
Text = {
Text = $"{ratioX}:{ratioY}", FontSize = 140, Align = TextAnchor.MiddleCenter
}
, RectTransform = {
AnchorMin = _valueLabelAnchor.AnchorMin, AnchorMax = _valueLabelAnchor.AnchorMax
}
}
, _innerUp, _ratioLabel);
CuiHelper.AddUi(player, UIInstance);
}
public void DestroyAspectRatioLabel(BasePlayer player) {
CuiHelper.DestroyUi(player, _ratioLabel);
}
public void DrawSizeLabel(BasePlayer player, float uiSize) {
CuiElementContainer UIInstance = new CuiElementContainer();
UIInstance.Add(new CuiLabel {
Text = {
Text = uiSize.ToString("0.0"), FontSize = 140, Align = TextAnchor.MiddleCenter
}
, RectTransform = {
AnchorMin = _valueLabelAnchor.AnchorMin, AnchorMax = _valueLabelAnchor.AnchorMax
}
}
, _innerDown, _sizeLabel);
CuiHelper.AddUi(player, UIInstance);
}
public void DestroySizeLabel(BasePlayer player) {
CuiHelper.DestroyUi(player, _sizeLabel);
}
public void DrawUIGuidePanel(BasePlayer player, int ratioX, int ratioY, float uiSize) {
string fitBelt = _langGlobal("FitBelt", player.UserIDString);
string fitWindow = _langGlobal("FitStatusW", player.UserIDString);
CuiElementContainer uiInstance = new CuiElementContainer();
UniversalRectAnchor scaledBeltAnchor = _itemBeltAnchor.Clone();
Scaler.ItemBeltScaling(ref scaledBeltAnchor, ratioX, ratioY, uiSize);
uiInstance.Add(new CuiPanel {
CursorEnabled = true, Image = {
Color = "0 0 0 0.5"
}
, RectTransform = {
AnchorMin = scaledBeltAnchor.AnchorMin, AnchorMax = scaledBeltAnchor.AnchorMax
}
,
}
, _main, _itemBeltPanel);
uiInstance.Add(new CuiLabel {
Text = {
Text = fitBelt, FontSize = (int)(18 * uiSize), Align = TextAnchor.MiddleCenter
}
, RectTransform = {
AnchorMin = _textPadding.AnchorMin, AnchorMax = _textPadding.AnchorMax
}
}
, _itemBeltPanel);
uiInstance.AddRange(GetOutline(_itemBeltPanel, 0.009f, 0.06f));
UniversalRectAnchor ScaledWindowAnchor = _statusWindowAnchor.Clone();
Scaler.StatusWindowScaling(ref ScaledWindowAnchor, ratioX, ratioY, uiSize);
uiInstance.Add(new CuiPanel {
CursorEnabled = true, Image = {
Color = "0 0 0 0.5"
}
, RectTransform = {
AnchorMin = ScaledWindowAnchor.AnchorMin, AnchorMax = ScaledWindowAnchor.AnchorMax
}
,
}
, _main, _statusWindowPanel);
uiInstance.Add(new CuiLabel {
Text = {
Text = fitWindow, FontSize = (int)(18 * uiSize), Align = TextAnchor.MiddleCenter
}
, RectTransform = {
AnchorMin = _textPadding.AnchorMin, AnchorMax = _textPadding.AnchorMax
}
}
, _statusWindowPanel);
uiInstance.AddRange(GetOutline(_statusWindowPanel, 0.015f, 0.049f));
#region test code
/*
CuiHelper.DestroyUi(player, "TestPanel");
StackRectAnchor TestPanelAnchor = new StackRectAnchor(0.1f, 0.12f, 0.34f, 0.2f);
UIScaler.ScalingResult scalingResult = uiScaler.UniversalPanelScaling(TestPanelAnchor, RootRectAnchor.RectCenter.LowerRight, UIScaler.ScalingParent.ItemBeltUpperLeft, RatioX, RatioY, UISize);
UIInstance.Add(new CuiPanel
{
CursorEnabled = true,
Image =
{
Color = "1 1 0 1"
},
RectTransform =
{
AnchorMin = scalingResult.AnchorMinX + " " + scalingResult.AnchorMinY,
AnchorMax = scalingResult.AnchorMaxX + " " + scalingResult.AnchorMaxY
},
}, Main, "TestPanel");
CuiHelper.DestroyUi(player, "TestPanel2");
StackRectAnchor TestPanelAnchor2 = new StackRectAnchor(0.65f, 0.12f, 0.8f, 0.2f);
UIScaler.ScalingResult scalingResult2 = uiScaler.UniversalPanelScaling(TestPanelAnchor2, RootRectAnchor.RectCenter.LowerLeft, UIScaler.ScalingParent.ItemBeltUpperRight, RatioX, RatioY, UISize);
UIInstance.Add(new CuiPanel
{
CursorEnabled = true,
Image =
{
Color = "1 1 0 1"
},
RectTransform =
{
AnchorMin = scalingResult2.AnchorMinX + " " + scalingResult2.AnchorMinY,
AnchorMax = scalingResult2.AnchorMaxX + " " + scalingResult2.AnchorMaxY
},
}, Main, "TestPanel2");
CuiHelper.DestroyUi(player, "TestPanel3");
StackRectAnchor TestPanelAnchor3 = new StackRectAnchor(0.4f, 0.11f, 0.6f, 0.2f);
UIScaler.ScalingResult scalingResult3 = uiScaler.UniversalPanelScaling(TestPanelAnchor3, RootRectAnchor.RectCenter.LowerCenter, UIScaler.ScalingParent.ItemBeltUpperCenter, RatioX, RatioY, UISize);
UIInstance.Add(new CuiPanel
{
CursorEnabled = true,
Image =
{
Color = "1 1 0 1"
},
RectTransform =
{
AnchorMin = scalingResult3.AnchorMinX + " " + scalingResult3.AnchorMinY,
AnchorMax = scalingResult3.AnchorMaxX + " " + scalingResult3.AnchorMaxY
},
}, Main, "TestPanel3");
CuiHelper.DestroyUi(player, "TestPanel4");
StackRectAnchor TestPanelAnchor4 = new StackRectAnchor(0.1f, 0.04f, 0.32f, 0.09f);
UIScaler.ScalingResult scalingResult4 = uiScaler.UniversalPanelScaling(TestPanelAnchor4, RootRectAnchor.RectCenter.MiddleRight, UIScaler.ScalingParent.ItemBeltMiddleLeft, RatioX, RatioY, UISize);
UIInstance.Add(new CuiPanel
{
CursorEnabled = true,
Image =
{
Color = "1 1 0 1"
},
RectTransform =
{
AnchorMin = scalingResult4.AnchorMinX + " " + scalingResult4.AnchorMinY,
AnchorMax = scalingResult4.AnchorMaxX + " " + scalingResult4.AnchorMaxY
},
}, Main, "TestPanel4");
CuiHelper.DestroyUi(player, "TestPanel5");
StackRectAnchor TestPanelAnchor5 = new StackRectAnchor(0.45f, 0.04f, 0.556f, 0.09f);
UIScaler.ScalingResult scalingResult5 = uiScaler.UniversalPanelScaling(TestPanelAnchor5, RootRectAnchor.RectCenter.MiddleCenter, UIScaler.ScalingParent.ItemBeltMiddleCenter, RatioX, RatioY, UISize);
UIInstance.Add(new CuiPanel
{
CursorEnabled = true,
Image =
{
Color = "1 1 0 1"
},
RectTransform =
{
AnchorMin = scalingResult5.AnchorMinX + " " + scalingResult5.AnchorMinY,
AnchorMax = scalingResult5.AnchorMaxX + " " + scalingResult5.AnchorMaxY
},
}, Main, "TestPanel5");
CuiHelper.DestroyUi(player, "TestPanel6");
StackRectAnchor TestPanelAnchor6 = new StackRectAnchor(0.7f, 0.04f, 0.8f, 0.09f);
UIScaler.ScalingResult scalingResult6 = uiScaler.UniversalPanelScaling(TestPanelAnchor6, RootRectAnchor.RectCenter.MiddleLeft, UIScaler.ScalingParent.ItemBeltMiddleRight, RatioX, RatioY, UISize);
UIInstance.Add(new CuiPanel
{
CursorEnabled = true,
Image =
{
Color = "1 1 0 1"
},
RectTransform =
{
AnchorMin = scalingResult6.AnchorMinX + " " + scalingResult6.AnchorMinY,
AnchorMax = scalingResult6.AnchorMaxX + " " + scalingResult6.AnchorMaxY
},
}, Main, "TestPanel6");
CuiHelper.DestroyUi(player, "TestPanel7");
StackRectAnchor TestPanelAnchor7 = new StackRectAnchor(0.1f, 0.01f, 0.32f, 0.02f);
UIScaler.ScalingResult scalingResult7 = uiScaler.UniversalPanelScaling(TestPanelAnchor7, RootRectAnchor.RectCenter.UpperRight, UIScaler.ScalingParent.ItemBeltMiddleLeft, RatioX, RatioY, UISize);
UIInstance.Add(new CuiPanel
{
CursorEnabled = true,
Image =
{
Color = "1 1 0 1"
},
RectTransform =
{
AnchorMin = scalingResult7.AnchorMinX + " " + scalingResult7.AnchorMinY,
AnchorMax = scalingResult7.AnchorMaxX + " " + scalingResult7.AnchorMaxY
},
}, Main, "TestPanel7");
CuiHelper.DestroyUi(player, "TestPanel8");
StackRectAnchor TestPanelAnchor8 = new StackRectAnchor(0.45f, 0.01f, 0.556f, 0.02f);
UIScaler.ScalingResult scalingResult8 = uiScaler.UniversalPanelScaling(TestPanelAnchor8, RootRectAnchor.RectCenter.UpperCenter, UIScaler.ScalingParent.ItemBeltMiddleCenter, RatioX, RatioY, UISize);
UIInstance.Add(new CuiPanel
{
CursorEnabled = true,
Image =
{
Color = "1 1 0 1"
},
RectTransform =
{
AnchorMin = scalingResult8.AnchorMinX + " " + scalingResult8.AnchorMinY,
AnchorMax = scalingResult8.AnchorMaxX + " " + scalingResult8.AnchorMaxY
},
}, Main, "TestPanel8");
CuiHelper.DestroyUi(player, "TestPanel9");
StackRectAnchor TestPanelAnchor9 = new StackRectAnchor(0.7f, 0.01f, 0.8f, 0.02f);
UIScaler.ScalingResult scalingResult9 = uiScaler.UniversalPanelScaling(TestPanelAnchor9, RootRectAnchor.RectCenter.UpperLeft, UIScaler.ScalingParent.ItemBeltMiddleRight, RatioX, RatioY, UISize);
UIInstance.Add(new CuiPanel
{
CursorEnabled = true,
Image =
{
Color = "1 1 0 1"
},
RectTransform =
{
AnchorMin = scalingResult9.AnchorMinX + " " + scalingResult9.AnchorMinY,
AnchorMax = scalingResult9.AnchorMaxX + " " + scalingResult9.AnchorMaxY
},
}, Main, "TestPanel9");
CuiHelper.DestroyUi(player, "TestPanel10");
StackRectAnchor TestPanelAnchor10 = new StackRectAnchor(0 + 0.42f, 0 + 0.22f, Xunit + 0.42f, Yunit + 0.22f);
UIScaler.ScalingResult scalingResult10 = uiScaler.UniversalPanelScaling(TestPanelAnchor10, RootRectAnchor.RectCenter.LowerLeft, UIScaler.ScalingParent.MainMiddleLeft, RatioX, RatioY, UISize);
UIInstance.Add(new CuiPanel
{
CursorEnabled = true,
Image =
{
Color = "1 1 0 1"
},
RectTransform =
{
// ... [Code preview truncated due to length. Full source in attached file] ...