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

FREE OxidationEventAnnouncer : 1.1.1 1.1.1

Нет прав для скачивания
C#:
/**
 * OxidationEventAnnouncer - Announces important events
 * Copyright (C) 2021 kasvoton [kasvoton@stinkfist.org]
 *
 * All Rights Reserved.
 * DO NOT DISTRIBUTE THIS SOFTWARE.
 *
 * You should have received a copy of the EULA along with this software.
 * If not, see <https://oxidation.stinkfist.org/license/eula.txt>.
 *
 *
 *                #################################
 *               ###  I AM AVAILABLE FOR HIRING  ###
 *                #################################
 *
 * IF YOU WANT A CUSTOM PLUGIN FOR YOUR SERVER GET INTO CONTACT WITH ME SO
 * WE CAN DISCUSS YOUR NEED IN DETAIL. I CAN BUILD PLUGINS FROM SCRATCH OR
 * MODIFY EXISTING ONES DEPENDING ON THE COMPLEXITY.
 *
 */

using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using Facepunch;
using Oxide.Core.Plugins;
using Oxide.Game.Rust.Cui;
using UnityEngine;

namespace Oxide.Plugins
{
	[Info("OxidationEventAnnouncer", "kasvoton", "1.1.1")]
	[Description("Project Oxidation :: Announces important events")]

	public class OxidationEventAnnouncer : RustPlugin
	{
		//
		// --- UMOD EVENTS -----------------------------------------------------
		//
		private void Unload()
		{
			foreach (BasePlayer Player in BasePlayer.activePlayerList)
				UnityEngine.Object.Destroy(Player.GetComponent<OxidationEventBehaviour>());
		}

		private void OnEntitySpawned(BaseNetworkable Entity)
		{
			if (Entity is CargoShip) BroadcastEvent(Locale("CargoShip"));
			else if (Entity is BradleyAPC) BroadcastEvent(Locale("BradleyAPC"));
			else if (Entity is CargoPlane) BroadcastEvent(Locale("CargoPlane"));
			else if (Entity is AttackHelicopter) BroadcastEvent(Locale("AttackHelicopter"));
			else if (Entity is PatrolHelicopter) BroadcastEvent(Locale("PatrolHelicopter"));

			else if (Entity is CH47HelicopterAIController)
			{
				CH47HelicopterAIController CH47 = Entity as CH47HelicopterAIController;

				if (CH47.landingTarget == Vector3.zero)
				{
					BroadcastEvent(Locale("ChinookHelicopter"));
					return;
				}

				string Target = string.Empty;
				List<RFBroadcaster> list = Pool.GetList<RFBroadcaster>();
				Vis.Entities<RFBroadcaster>(CH47.landingTarget, 25f, list);

				switch (list.FirstOrDefault()?.GetFrequency())
				{
					case 4765:
						Target = Locale("Small");
						break;

					case 4768:
						Target = Locale("Large");
						break;
				}

				BroadcastEvent(Locale("Oilrig", Target));
			}
		}

		//
		// --- API -------------------------------------------------------------
		//
		[HookMethod("Broadcast")]
		private void BroadcastEvent(string Message, string Background = null, string Foreground = null)
			=> ServerMgr.Instance.StartCoroutine(DoBroadcast(Message, Background, Foreground));

		//
		// --- COROUTINES ------------------------------------------------------
		//
		private IEnumerator DoBroadcast(string Message, string Background = null, string Foreground = null)
		{
			List<BasePlayer> Players = BasePlayer.activePlayerList.ToList();
			foreach (BasePlayer Player in Players)
			{
				OxidationEventBehaviour Announcer = Player.GetComponent<OxidationEventBehaviour>();
				if (Announcer != null) UnityEngine.Object.Destroy(Announcer);
				yield return CoroutineEx.waitForEndOfFrame;

				Announcer = Player.gameObject.AddComponent<OxidationEventBehaviour>();
				if (Announcer == null) continue;

				if (Background != null) Announcer.BackgroundColor = Background;
				if (Foreground != null) Announcer.TextColor = Foreground;

				Announcer.Message = Message;
				Announcer.enabled = true;
			}
		}

		//
		// --- BEHAVIOURS ------------------------------------------------------
		//
		public class OxidationEventBehaviour : MonoBehaviour
		{
			public string Message
			{ get; set; }

			protected BasePlayer Player;
			protected float LastClientUpdate;
			protected CuiElementContainer Container;

			protected string _TextColor = "1.0 1.0 1.0 0.85";

			public string TextColor
			{
				get
				{
					return _TextColor;
				}

				set
				{
					_TextColor = HexToColor(value, 0.85);
					return;
				}
			}

			public string _BackgroundColor = "0.803 0.274 0.196 0.850";

			public string BackgroundColor
			{
				get
				{
					return _BackgroundColor;
				}

				set
				{
					_BackgroundColor = HexToColor(value, 0.85);
					return;
				}
			}

			internal OxidationEventBehaviour()
			{ enabled = false; }

			internal void Awake()
				=> Player = GetComponent<BasePlayer>();

			internal void Start()
				=> LastClientUpdate = Time.realtimeSinceStartup;

			internal void OnEnable()
			{
				Container = new CuiElementContainer();
				const float FadeIn = 0.5f, FadeOut = 0.5f;

				Container.Add(new CuiElement
				{
					Name = $"UIEvent",
					Parent = "Hud",
					FadeOut = FadeOut,
					Components =
					{
						new CuiImageComponent
						{

							Color = $"{BackgroundColor}",
							FadeIn = FadeIn
						},

						new CuiRectTransformComponent
						{
							AnchorMin = "0.000 0.830",
							AnchorMax = "1.000 0.900"
						}
					}
				});

				Container.Add(new CuiElement
				{
					Name = $"UIEvent.border.top",
					Parent = $"UIEvent",
					FadeOut = FadeOut,
					Components =
					{
						new CuiImageComponent
						{
							Color = "1.0 1.0 1.0 0.85",
							FadeIn = FadeIn
						},

						new CuiRectTransformComponent
						{
							AnchorMin = "0.000 0.990",
							AnchorMax = "1.000 1.000"
						}
					}
				});

				Container.Add(new CuiElement
				{
					Name = $"UIEvent.border.bottom",
					Parent = $"UIEvent",
					FadeOut = FadeOut,
					Components =
					{
						new CuiImageComponent
						{
							Color = "1.0 1.0 1.0 0.85",
							FadeIn = FadeIn
						},

						new CuiRectTransformComponent
						{
							AnchorMin = "0.000 0.000",
							AnchorMax = "1.000 0.010"
						}
					}
				});

				Container.Add(new CuiElement
				{
					Name = $"UIEvent.text",
					Parent = $"UIEvent",
					FadeOut = FadeOut,
					Components =
					{
						new CuiTextComponent
						{
							Font = "RobotoCondensed-Bold.ttf",
							Align = TextAnchor.MiddleCenter,
							Color = $"{TextColor}",
							FadeIn = FadeIn,
							Text = Message,
							FontSize = 26,
						},

						new CuiRectTransformComponent
						{
							AnchorMin = "0.000 0.000",
							AnchorMax = "1.000 1.000"
						}
					}
				});

				CuiHelper.AddUi(Player, Container);
			}

			internal void FixedUpdate()
			{
				if (Time.realtimeSinceStartup - LastClientUpdate >= 5.0f)
					UnityEngine.Object.Destroy(this);
			}

			internal void OnDisable()
			{
				foreach (CuiElement Element in Container.Reverse<CuiElement>())
					CuiHelper.DestroyUi(Player, Element.Name);
			}

			internal static string HexToColor(string Color, double Alpha = 1.0f)
			{
				if (Color.StartsWith("#")) Color
					= Color.TrimStart('#');

				System.Globalization.NumberStyles Style
					= System.Globalization.NumberStyles.AllowHexSpecifier;

				int R = int.Parse(Color.Substring(0, 2), Style);
				int G = int.Parse(Color.Substring(2, 2), Style);
				int B = int.Parse(Color.Substring(4, 2), Style);

				return $"{(double)R / 255f} {(double)G / 255f} {(double)B / 255f} {Alpha}";
			}
		}

		//
		// --- LOCALIZATION ------------------------------------------------------------------------------------------------------
		//
		internal string Locale(string Key, params object[] args)
			=> string.Format(lang.GetMessage(Key, this), args);

		protected override void LoadDefaultMessages()
		{
			lang.RegisterMessages(new Dictionary<string, string>
			{
				["CargoShip"] = "A Cargo Ship has been spotted near shore",
				["BradleyAPC"] = "A M3 Bradley is now patrolling the island",
				["CargoPlane"] = "An incoming Cargo Plane has been spotted",
				["AttackHelicopter"] = "A new attack helicopter was detected on the island",
				["PatrolHelicopter"] = "An UH-1Y Venom has been spotted patrolling the island",
				["ChinookHelicopter"] = "A CH47 Chinook has been spotted patrolling the island",
				["Oilrig"] = "A CH47 Chinook has been spotted heading to the {0} Oilrig",
				["Small"] = "small",
				["Large"] = "large",
			}, this);
		}
	}
}

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