Иконка ресурса

FREE OnScreenLogo : 1.0.5 1.0.5

Нет прав для скачивания
C#:
// Все права принадлежат дискорд сообществу https://discord.gg/VgNHPpNrz6
using Oxide.Core;
using Oxide.Core.Plugins;
using Oxide.Game.Rust.Cui;
using System;
using System.Collections.Generic;
using System.Collections;
using System.IO;
using UnityEngine;
using JSON;

namespace Oxide.Plugins
{
	/* Based on version 1.1.5 by Vlad-00003 */
    [Info("OnScreenLogo", "Nimant", "1.0.5", ResourceId = 2601)]
    [Description("Displays the button on the player screen.")]
    //Author info:
    //E-mail: Vlad-00003@mail.ru
    //Vk: vk.com/vlad_00003
    class OnScreenLogo : RustPlugin
    {
		
		[PluginReference]
  		private Plugin AspectRatio;
		
        private string PanelName = "GsAdX1wazasdsHs";
        private string Image = null;
        private static OnScreenLogo instance;
		private static List<ulong> ExcludePlayers = new List<ulong>();
		private const string PermToggleAllow = "onscreenlogo.toggle";
		
		private float MinX, MinY, MaxX, MaxY;

        #region Config Setup
		
        private string Amax = "0.34 0.105";
        private string Amin = "0.26 0.025";
        private string ImageAddress = "https://i.imgur.com/Fx2iX0x.png";				
		
        #endregion

        #region Initialization
		
		private void Init()
		{
			instance = this;
			permission.RegisterPermission(PermToggleAllow, this);
			LoadData();
		}
		
        protected override void LoadDefaultConfig() => PrintWarning("Generating default configuration file...");
        
        protected override void LoadConfig()
        {
            base.LoadConfig();
            
			GetConfig("Image.Link or name of the file in the data folder", ref ImageAddress);
            GetConfig("Minimum anchor", ref Amin);
            GetConfig("Maximum anchor", ref Amax);
			
			MinX = Convert.ToSingle(Amin.Split(' ')[0]);
			MinY = Convert.ToSingle(Amin.Split(' ')[1]);
			MaxX = Convert.ToSingle(Amax.Split(' ')[0]);
			MaxY = Convert.ToSingle(Amax.Split(' ')[1]);
            
			if (!ImageAddress.ToLower().Contains("http"))            
                ImageAddress = "file://" + Interface.Oxide.DataDirectory + Path.DirectorySeparatorChar + ImageAddress;
                        
            SaveConfig();
        }
        
        private void OnServerInitialized() => RunCheckTimer();
		
        private void Unload()
        {
            foreach (var player in BasePlayer.activePlayerList)            
                CuiHelper.DestroyUi(player, PanelName);            
        }
		
        #endregion
		
		#region Commands
		
		[ChatCommand("logo")]
        private void cmdChatToggleLogo(BasePlayer player, string command, string[] args)
        {
            if (player == null || (!permission.UserHasPermission(player.UserIDString, PermToggleAllow) && !player.IsAdmin)) return;
			
			if (args==null || args.Length==0 || (args[0] != "on" && args[0] != "off"))
			{
				SendReply(player, "Использование: logo <on|off> - включить или выключить отображение логотипа.");
				return;
			}	
			
			if (args[0]=="off")
			{	
				if (!ExcludePlayers.Contains(player.userID))
					ExcludePlayers.Add(player.userID);
				CuiHelper.DestroyUi(player, PanelName);   
				SendReply(player, "Отображение логотипа выключено.");
			}	
			
			if (args[0]=="on")
			{					
				if (ExcludePlayers.Contains(player.userID))
					ExcludePlayers.Remove(player.userID);
				CreateButton(player, false);
				SendReply(player, "Отображение логотипа включено.");
			}	
			
			SaveData();
		}
		
		#endregion

        #region Image Downloading
        
		private int CountRefresh = 30;
		
		private void RunCheckTimer()
		{
			if (Image == null)
			{
				DownloadImage();
				timer.Once(1f, RunCheckTimer);
				return;
			}
			
			foreach (BasePlayer player in BasePlayer.activePlayerList)                
				CreateButton(player, false);

			if (CountRefresh > 0)
			{
				Image = null;
				timer.Once(2f, RunCheckTimer);
				CountRefresh--;
			}
		}
		
        private void DownloadImage() => ServerMgr.Instance.StartCoroutine(DownloadImage(ImageAddress));        
		
        private IEnumerator DownloadImage(string url)
        {
            using (var www = new WWW(url))
            {
                yield return www;
                if (instance == null) yield break;
                if (www.error != null)                
                    PrintError($"Failed to add image.File address possibly invalide\n {url}");                
                else
                {
                    var tex = www.texture;
                    byte[] bytes = tex.EncodeToPNG();
                    Image = FileStorage.server.Store(bytes, FileStorage.Type.png, CommunityEntity.ServerInstance.net.ID).ToString();                                        															
                    UnityEngine.Object.DestroyImmediate(tex);
                    yield break;
                }
            }
        }
		
        #endregion
		
		#region Resolution

		private static Dictionary<ulong, int> PlayerResolution = new Dictionary<ulong, int>();
		
		private static int GetUserResolution(ulong userID, bool refresh = false)
		{
			int resolution = 1;
			
			if (!refresh && PlayerResolution.ContainsKey(userID))
				resolution = PlayerResolution[userID];
			else
				if (instance.AspectRatio != null)
				{
					resolution = (int)instance.AspectRatio?.Call("ApiGetRatio", userID);
					
					if (!PlayerResolution.ContainsKey(userID))
						PlayerResolution.Add(userID, resolution);
					else
						PlayerResolution[userID] = resolution;
				}
				
			return resolution;
		}
		
		private void ApiSetRatio(BasePlayer player, int resolution) => CreateButton(player, true);
		
		public static float GetCorrectAnchors(ulong userID, float MinX, float MinY, float MaxX, float MaxY, ref string anchorMin, ref string anchorMax, bool refresh)
		{			
			float defaultX = 0f, deltaX = 0f;																	
			var resolution = GetUserResolution(userID, refresh);												
			defaultX = (MaxY - MinY) / (16f/10f);
			
			switch (resolution)
			{
				case 0: deltaX = (MaxY - MinY) / (16f/9f); break;
				case 3: deltaX = (MaxY - MinY) / (5f/4f); break;
				case 2: deltaX = (MaxY - MinY) / (4f/3f); break;
				default:
				case 1: deltaX = (MaxY - MinY) / (16f/10f); break;
			}
						
			defaultX -= deltaX;
			
			anchorMin = $"{MinX + defaultX/2f} {MinY}";
			anchorMax = $"{MaxX - defaultX/2f} {MaxY}";
			
			return defaultX;
		}
		
		#endregion

        #region UI
		
        private void OnPlayerSleepEnded(BasePlayer player) => CreateButton(player, false);
		
        private void CreateButton(BasePlayer player, bool refresh)
        {
			if (ExcludePlayers.Contains(player.userID)) return;
			
            CuiHelper.DestroyUi(player, PanelName);
            CuiElementContainer elements = new CuiElementContainer();
			
			string AnchorMin = Amin, AnchorMax = Amax;
			
			GetCorrectAnchors(player.userID, MinX, MinY, MaxX, MaxY, ref AnchorMin, ref AnchorMax, refresh);
			
            var panel = elements.Add(new CuiPanel
            {
                Image = {
                    Color = "0.00 0.00 0.00 0.00"
                },
                RectTransform = {
                    AnchorMin = AnchorMin,
                    AnchorMax = AnchorMax
                },
                CursorEnabled = false
            }, "Hud", PanelName);
			
            var comp = new CuiRawImageComponent { Sprite = "assets/content/textures/generic/fulltransparent.tga" };
			
            if (Image != null)
                comp.Png = Image;
            
            elements.Add(new CuiElement
            {
                Parent = PanelName,
                Components =
                {
                    comp,
                    new CuiRectTransformComponent {AnchorMin = "0 0", AnchorMax = "1 1" }
                }
            });
			
            CuiHelper.AddUi(player, elements);			
			Interface.CallHook("API_OnLogoDrew", player);
        }								
		
        #endregion

        #region Helpers
		
        private void GetConfig<T>(string Key, ref T var)
        {
            if (Config[Key] != null)
            {
                var = (T)Convert.ChangeType(Config[Key], typeof(T));
            }
            Config[Key] = var;
        }
		
        #endregion
		
		#region API
		
		private List<string> API_GetLogoSize(ulong userID)
		{
			string AnchorMin = Amin, AnchorMax = Amax;			
			GetCorrectAnchors(userID, MinX, MinY, MaxX, MaxY, ref AnchorMin, ref AnchorMax, false);
			return new List<string>() { AnchorMin, AnchorMax };			
		}
		
		#endregion
		
		#region Data
		
		private void LoadData() => ExcludePlayers = Interface.GetMod().DataFileSystem.ReadObject<List<ulong>>("OnScreenLogoData");					
		
		private void SaveData() => Interface.GetMod().DataFileSystem.WriteObject("OnScreenLogoData", ExcludePlayers);		
		
		#endregion
		
    }
}

Автор
15FPS
Скачиваний
0
Просмотры
1
Первый выпуск
Обновление
Оценка
0.00 звёзд 0 оценок
Сверху