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

FREE CLottery : 2.1 2.1

Нет прав для скачивания
C#:
using System;
using System.Collections.Generic;
using System.Linq;
using Newtonsoft.Json;
using Oxide.Core;
using Oxide.Core.Libraries.Covalence;
using Oxide.Game.Rust.Cui;
using Rust;

namespace Oxide.Plugins
{
	[Info("CLottery", "Crazy", 2.1)]
	[Description("Randomly select player every X hours, offer him a gift based on the number of player connected")]
	class CLottery : RustPlugin
	{

		#region CONFIG

		#region GENERAL
		private cConfig c;
		private class cConfig
		{
			[JsonProperty("1. COMMAND CHAT")]
			public string command;

			[JsonProperty("2. SCHEDULES FOR SEND")]
			public string[] schedules;

			[JsonProperty("3. LOTTERY")]
			public List<LotteryList> lottery;
			public class LotteryList
			{
				[JsonProperty("Minimum players")]
				public int min;

				[JsonProperty("Maximum players")]
				public int max;
				
				[JsonProperty("Gifts")]
				public List<GiftList> gift;
			}
			public static cConfig GetDefaultConfig()
			{
				return new cConfig
				{
					command = "lottery",
					schedules = new string[] {"01:00","03:00","05:00","07:00","09:00","11:00","13:00","15:00","17:00","19:00","21:00","23:00"},
					lottery = new List<LotteryList>
					{
						new LotteryList
						{
							min = 0,
							max = 2,
							gift = null
						},
						new LotteryList
						{
							min = 3,
							max = 5,
							gift = new List<GiftList>
							{
								new GiftList
								{
									name = "scrap",
									quantity = 50,
								}
							}
						},
						new LotteryList
						{
							min = 6,
							max = 10,
							gift = new List<GiftList>
							{
								new GiftList
								{
									name = "xmas.present.small",
									quantity = 1,
								}
							}
						},
						new LotteryList
						{
							min = 11,
							max = 20,
							gift = new List<GiftList>
							{
								new GiftList
								{
									name = "xmas.present.small",
									quantity = 1,
								},
								new GiftList
								{
									name = "scrap",
									quantity = 50,
								}
							}
						},
						new LotteryList
						{
							min = 21,
							max = 30,
							gift = new List<GiftList>
							{
								new GiftList
								{
									name = "xmas.present.medium",
									quantity = 1,
								}
							}
						},
						new LotteryList
						{
							min = 31,
							max = 50,
							gift = new List<GiftList>
							{
								new GiftList
								{
									name = "xmas.present.medium",
									quantity = 1,
								},
								new GiftList
								{
									name = "scrap",
									quantity = 75
								}
							}
						},
						new LotteryList
						{
							min = 51,
							max = 75,
							gift = new List<GiftList>
							{
								new GiftList
								{
									name = "xmas.present.large",
									quantity = 1,
								}
							}
						},
						new LotteryList
						{
							min = 76,
							max = 200,
							gift = new List<GiftList>
							{
								new GiftList
								{
									name = "xmas.present.large",
									quantity = 1,
								},
								new GiftList
								{
									name = "scrap",
									quantity = 75,
								}
							}
						},
					}
				};
			}
		}
		#endregion

		#region OBJECT
		public class GiftList
		{
			[JsonProperty("Short name")]
			public string name;

			[JsonProperty("Quantity")]
			public int quantity;
		}
		#endregion

		#region LOAD / SAVE
		protected override void LoadConfig() { base.LoadConfig(); c = Config.ReadObject<cConfig>(); }
		protected override void LoadDefaultConfig() => c = cConfig.GetDefaultConfig();
		protected override void SaveConfig() => Config.WriteObject(c);
		#endregion

		#endregion

		#region DICTIONARY
		public Dictionary<string, string> Lang = new Dictionary<string, string> {
			{"Title", "<color=#f1c40f>LOTTERY</color>"},
			{"Message", "As <color=#87ceeb> every 2 hours</color>, one player is randomly chosen\n\n" +
						"This one will win a gift, depending on the number of players <color=#87ceeb>connected</color> !\n\n" +
						"The list of rewards is available on Discord or on the interface <color=#87ceeb>/info</color>."},
			{"NotEnought", "Not enough players for the <color=#87ceeb>lottery</color>\n\n"+
						   "Next lottery<color=#87ceeb> in 2 hours</color>."},
			{"Timer1", "3"},
			{"Timer2", "2"},
			{"Timer3", "1"},
			{"Winner", "Congratulations to <color=#f1c40f>{winner}</color>"},
			{"Reclam", "Claim your gift  <b><color=#87ceeb>/{command}</color></b>"},
			{"NotGifts", "You don't have a gift to reclaim."},
			{"RestoreGifts", "Your gifts have been added to your inventory."},
		};

		public HashSet<LGifts> lGifts = new HashSet<LGifts>();
		#endregion

		#region DATA
		void LoadData() => lGifts = Interface.Oxide.DataFileSystem.ReadObject<HashSet<LGifts>>("CLottery/Lottery");
		void SaveData() => Interface.Oxide.DataFileSystem.WriteObject("CLottery/Lottery", lGifts);
		public class LGifts
		{
			public ulong id;
			public string name;
			public int quantity;
			public LGifts() { }
		}
		#endregion

		#region SERVER
		private void OnServerInitialized() => cmd.AddChatCommand(c.command, this, nameof(LoterieCommand));
		private void OnNewSave(string filename)
		{
			LoadData();
			lGifts.Clear();
			SaveData();
		}
		private void Unload()
		{
			foreach (var player in BasePlayer.activePlayerList)
				DestroyUI(player);
		}
		private void OnTick() => Schedules();
		#endregion

		#region MESSAGE
		private void MessageReply(IPlayer player, string m) => player.Reply($"<color=#f1c40f><size=15>SERVER :</size></color> {m}");
		private string Translate(string msg, Dictionary<string, string> parameters = null)
		{
			if (string.IsNullOrEmpty(msg))
				return string.Empty;
			if (parameters != null)
			{
				foreach (var lekey in parameters)
				{
					if (msg.Contains("{" + lekey.Key + "}"))
						msg = msg.Replace("{" + lekey.Key + "}", lekey.Value);
				}
			}
			return msg;
		}
		#endregion

		#region SCHEDULES
		private bool SchedulesSend = false;
		public void Schedules()
		{
			var dateNow = DateTime.Now.ToString("HH:mm:ss");
			foreach (string time in c.schedules)
			{
				if (dateNow == $"{time}:00" && !SchedulesSend)
				{
					SendGift();
					SchedulesSend = true;
					timer.Once(5, () => { SchedulesSend = false; });
				}
			}			
		}
		#endregion

		#region EFFECT
		private void SendEffect(BasePlayer player, string sound, float vol)
		{
			var effect = new Effect(sound, player, 0, new UnityEngine.Vector3(0, vol, 0), UnityEngine.Vector3.forward);
			EffectNetwork.Send(effect, player.net.connection);
		}
		#endregion

		#region FUNCTIONS
		public bool CheckHasGifts(BasePlayer player)
		{
			if (Interface.Oxide.DataFileSystem.ExistsDatafile("CLottery/Lottery"))
			{
				LoadData();
				if (lGifts.Count() != 0)
				{
					bool exist = lGifts.Any(x => x.id == player.userID);
					if (!exist)
						return false;

					return true;
				}
				return false;
			}
			return false;
		}
		public void RestoreGifts(BasePlayer player)
		{
			LoadData();

			if (!CheckHasGifts(player))
				return;

			foreach (LGifts g in lGifts.Where(x => x.id == player.userID))
			{
				Server.Command($"inventory.giveto {g.id} {g.name} {g.quantity}");
			}

			lGifts.RemoveWhere(x => x.id == player.userID);

			SaveData();
		}
		private BasePlayer RandPlayers()
		{
			if (BasePlayer.activePlayerList.Count == 0)
				return null;

			List<BasePlayer> WithoutAdmin = (BasePlayer.activePlayerList.Where(x => !x.IsAdmin).Select(player => player)).ToList();

			if (WithoutAdmin.Count == 0)
				return null;

			BasePlayer[] array = WithoutAdmin.ToArray<BasePlayer>();

			System.Random rand = new System.Random();
			BasePlayer playerWin = array[rand.Next(array.Length)];

			return playerWin;
		}
		public void SendGift()
		{
			BasePlayer playerWin = RandPlayers();
			if (playerWin == null)
			{
				foreach (var player in BasePlayer.activePlayerList)
				{
					CreateUITitle(player);
					CreateUIMessage(player);
					SendEffect(player, "assets/prefabs/tools/pager/effects/vibrate.prefab", 1);
					timer.Once(10f, () => {
						CuiHelper.DestroyUi(player, "CLottery.message");
						CreateUINotEnought(player);
					});
					timer.Once(20f, () => { DestroyUI(player); });
				}
				return;
			}

			List<BasePlayer> WithoutAdmin = (BasePlayer.activePlayerList.Where(x => !x.IsAdmin).Select(player => player)).ToList();

			int count = WithoutAdmin.Count;

			foreach (var x in c.lottery)
			{
				if (count >= x.min && count <= x.max)
				{
					if (x.min == 0 && x.gift == null)
					{
						foreach (var player in BasePlayer.activePlayerList)
						{
							CreateUITitle(player);
							CreateUIMessage(player);
							SendEffect(player, "assets/prefabs/tools/pager/effects/vibrate.prefab", 1);
							timer.Once(10f, () => {
								CuiHelper.DestroyUi(player, "CLottery.message");
								CreateUINotEnought(player);
							});
							timer.Once(20f, () => { DestroyUI(player); });
						}
						return;
					}
					if (x.gift != null)
					{
						foreach (var player in BasePlayer.activePlayerList)
						{
							CreateUITitle(player);
							CreateUIMessage(player);
							SendEffect(player, "assets/prefabs/tools/pager/effects/vibrate.prefab", 1);
							timer.Once(10f, () => {
								CuiHelper.DestroyUi(player, "CLottery.message");
							});
							timer.Once(10.1f, () => {
								CreateUITimers1(player);
								SendEffect(player, "assets/prefabs/locks/keypad/effects/lock.code.unlock.prefab", 2);
							});
							timer.Once(11.1f, () => {
								CuiHelper.DestroyUi(player, "CLottery.timer1");
								CreateUITimers2(player);
								SendEffect(player, "assets/prefabs/locks/keypad/effects/lock.code.unlock.prefab", 2);
							});
							timer.Once(12.1f, () => {
								CuiHelper.DestroyUi(player, "CLottery.timer2");
								CreateUITimers3(player);
								SendEffect(player, "assets/prefabs/locks/keypad/effects/lock.code.unlock.prefab", 2);
							});
							timer.Once(13.3f, () => {
								CuiHelper.DestroyUi(player, "CLottery.timer3");
								CreateUIWinner(player, playerWin.displayName);
								CreateUIReclam(player);
								SendEffect(player, "assets/prefabs/misc/halloween/lootbag/effects/gold_open.prefab", 3);
							});
							timer.Once(30f, () => { DestroyUI(player); });
						}

						foreach (var g in x.gift)
						{
							LoadData();
							lGifts.Add(new LGifts() { id = playerWin.userID, name = g.name, quantity = g.quantity });
							SaveData();
						}

						var dateTime = System.DateTime.Now.ToString("dd-MM-yyyy HH:mm:ss");
						LogToFile($"logs", $"[{dateTime}] Gagnant:{playerWin.userID}", this);
					}
				}
			}
		}
		#endregion

		#region UI
		private void CreateUITitle(BasePlayer player)
		{
			var container = new CuiElementContainer();
			var title = container.Add(new CuiPanel
			{
				Image = { Color = "0 0 0 0" },
				RectTransform = { AnchorMin = "0.79 0.63", AnchorMax = "0.99 0.89" }
			}, "Hud", "CLottery.title");
			container.Add(new CuiElement
			{
				Parent = title,
				Components =
				{
					new CuiTextComponent
					{
						Text = Lang["Title"], FontSize = 16, FadeIn = 3f,
						Color = "1 1 1 0.6",
						Font = "robotocondensed-bold.ttf",
						Align = UnityEngine.TextAnchor.UpperLeft
					},
					new CuiRectTransformComponent {AnchorMin = "0 0", AnchorMax = "1 1"}
				}
			});
			CuiHelper.AddUi(player, container);
		}
		private void CreateUIMessage(BasePlayer player)
		{
			var container = new CuiElementContainer();
			var message = container.Add(new CuiPanel
			{
				Image = { Color = "0 0 0 0" },
				RectTransform = { AnchorMin = "0.79 0.70", AnchorMax = "0.99 0.89" }
			}, "Hud", "CLottery.message");
			container.Add(new CuiElement
			{
				Parent = message,
				Components =
				{
					new CuiTextComponent
					{
						Text = Lang["Message"], FontSize = 12, FadeIn = 3f,
						Font = "robotocondensed-regular.ttf",
						Align = UnityEngine.TextAnchor.UpperLeft
					},
					new CuiRectTransformComponent {AnchorMin = "0 0", AnchorMax = "1 0.8"}
				}
			});
			CuiHelper.AddUi(player, container);
		}
		private void CreateUITimers1(BasePlayer player)
		{
			var container = new CuiElementContainer();
			var timers1 = container.Add(new CuiPanel
			{
				Image = { Color = "0 0 0 0" },
				RectTransform = { AnchorMin = "0.79 0.75", AnchorMax = "0.99 0.89" }
			}, "Hud", "CLottery.timer1");
			container.Add(new CuiElement
			{
				Parent = timers1,
				Components =
				{
					new CuiTextComponent
					{
						Text = Lang["Timer1"].ToUpper(), FontSize = 50, FadeIn = 1f,
						Font = "robotocondensed-bold.ttf",
						Align = UnityEngine.TextAnchor.MiddleCenter
					},
					new CuiRectTransformComponent {AnchorMin = "0 0", AnchorMax = "1 0.8"}
				}
			});
			CuiHelper.AddUi(player, container);
		}
		private void CreateUITimers2(BasePlayer player)
		{
			var container = new CuiElementContainer();
			var timers2 = container.Add(new CuiPanel
			{
				Image = { Color = "0 0 0 0" },
				RectTransform = { AnchorMin = "0.79 0.75", AnchorMax = "0.99 0.89" }
			}, "Hud", "CLottery.timer2");
			container.Add(new CuiElement
			{
				Parent = timers2,
				Components =
				{
					new CuiTextComponent
					{
						Text = Lang["Timer2"].ToUpper(), FontSize = 50, FadeIn = 1f,
						Font = "robotocondensed-bold.ttf",
						Align = UnityEngine.TextAnchor.MiddleCenter
					},
					new CuiRectTransformComponent {AnchorMin = "0 0", AnchorMax = "1 0.8"}
				}
			});
			CuiHelper.AddUi(player, container);
		}
		private void CreateUITimers3(BasePlayer player)
		{
			var container = new CuiElementContainer();
			var timers3 = container.Add(new CuiPanel
			{
				Image = { Color = "0 0 0 0" },
				RectTransform = { AnchorMin = "0.79 0.75", AnchorMax = "0.99 0.89" }
			}, "Hud", "CLottery.timer3");
			container.Add(new CuiElement
			{
				Parent = timers3,
				Components =
				{
					new CuiTextComponent
					{
						Text = Lang["Timer3"].ToUpper(), FontSize = 50, FadeIn = 1f,
						Font = "robotocondensed-bold.ttf",
						Align = UnityEngine.TextAnchor.MiddleCenter
					},
					new CuiRectTransformComponent {AnchorMin = "0 0", AnchorMax = "1 0.8"}
				}
			});
			CuiHelper.AddUi(player, container);
		}
		private void CreateUIWinner(BasePlayer player, string playerWin)
		{
			var container = new CuiElementContainer();
			var winner = container.Add(new CuiPanel
			{
				Image = { Color = "0 0 0 0" },
				RectTransform = { AnchorMin = "0.79 0.7975", AnchorMax = "0.99 0.89" }
			}, "Hud", "CLottery.winner");
			container.Add(new CuiElement
			{
				Parent = winner,
				Components =
				{
					new CuiTextComponent
					{
						Text = Translate(Lang["Winner"], new Dictionary<string, string>{{ "winner", playerWin },}), FontSize = 16, FadeIn = 1f,
						Font = "robotocondensed-regular.ttf",
						Align = UnityEngine.TextAnchor.MiddleCenter
					},
					new CuiRectTransformComponent {AnchorMin = "0 0", AnchorMax = "1 0.8"}
				}
			});

			CuiHelper.AddUi(player, container);
		}
		private void CreateUIReclam(BasePlayer player)
		{
			var container = new CuiElementContainer();
			var reclam = container.Add(new CuiPanel
			{
				Image = { Color = "0 0 0 0" },
				RectTransform = { AnchorMin = "0.79 0.87", AnchorMax = "0.99 0.89" }
			}, "Hud", "CLottery.reclam");
			container.Add(new CuiElement
			{
				Parent = reclam,
				Components =
				{
					new CuiTextComponent
					{
						Text = "| i |", FontSize = 14, FadeIn = 1f,
						Font = "robotocondensed-regular.ttf",
						Align = UnityEngine.TextAnchor.MiddleRight
					},
					new CuiRectTransformComponent {AnchorMin = "0 0", AnchorMax = "0.557 1"}
				}
			});
			container.Add(new CuiElement
			{
				Parent = reclam,
				Components =
				{
					new CuiTextComponent
					{
						Text = Translate(Lang["Reclam"], new Dictionary<string, string>{{ "command", c.command },}), FontSize = 13, FadeIn = 1f,
						Font = "robotocondensed-regular.ttf",
						Align = UnityEngine.TextAnchor.MiddleRight
					},
					new CuiRectTransformComponent {AnchorMin = "0.15 0", AnchorMax = "1 1"}
				}
			});

			CuiHelper.AddUi(player, container);
		}
		private void CreateUINotEnought(BasePlayer player)
		{
			var container = new CuiElementContainer();
			var notEnought = container.Add(new CuiPanel
			{
				Image = { Color = "0 0 0 0" },
				RectTransform = { AnchorMin = "0.79 0.76", AnchorMax = "0.99 0.89" }
			}, "Hud", "CLottery.notenought");
			container.Add(new CuiElement
			{
				Parent = notEnought,
				Components =
				{
					new CuiTextComponent
					{
						Text = Lang["NotEnought"], FontSize = 12, FadeIn = 3f,
						Font = "robotocondensed-regular.ttf",
						Align = UnityEngine.TextAnchor.MiddleLeft
					},
					new CuiRectTransformComponent {AnchorMin = "0 0", AnchorMax = "1 1"}
				}
			});
			CuiHelper.AddUi(player, container);
		}
		private void DestroyUI(BasePlayer player)
		{
			CuiHelper.DestroyUi(player, "CLottery.title");
			CuiHelper.DestroyUi(player, "CLottery.message");
			CuiHelper.DestroyUi(player, "CLottery.timer1");
			CuiHelper.DestroyUi(player, "CLottery.timer2");
			CuiHelper.DestroyUi(player, "CLottery.timer3");
			CuiHelper.DestroyUi(player, "CLottery.winner");
			CuiHelper.DestroyUi(player, "CLottery.reclam");
			CuiHelper.DestroyUi(player, "CLottery.notenought");
		}
		#endregion

		#region COMMAND
		private void LoterieCommand(BasePlayer player, string command, string[] args)
		{
			if (args.Count() != 0)
				return;

			if (!CheckHasGifts(player))
			{
				MessageReply(player.IPlayer, Translate(Lang["NotGifts"]));
				SendEffect(player, "assets/prefabs/weapons/toolgun/effects/repairerror.prefab", 1);
				return;
			}

			MessageReply(player.IPlayer, Translate(Lang["RestoreGifts"]));
			SendEffect(player, "assets/prefabs/deployable/dropbox/effects/submit_items.prefab", 1);
			RestoreGifts(player);
		}
		#endregion

		/*#region TEST UI
		private void Loaded()
		{
			foreach (var player in BasePlayer.activePlayerList)
			{
				CreateUITitle(player);
				CreateUIMessage(player);

				timer.Once(5f, () => {
					CreateUITimers1(player);
					CuiHelper.DestroyUi(player, "CLottery.message");
				});
				timer.Once(7f, () => {
					CreateUITimers2(player);
					CuiHelper.DestroyUi(player, "CLottery.timer1");
				});
				timer.Once(9f, () => {
					CreateUITimers3(player);
					CuiHelper.DestroyUi(player, "CLottery.timer2");
				});
				timer.Once(11f, () => {
					CreateUIWinner(player, "TF Crazy");
					CreateUIReclam(player);
					CuiHelper.DestroyUi(player, "CLottery.timer3");
				});

				timer.Once(13f, () => {
					CreateUINotEnought(player);
					CuiHelper.DestroyUi(player, "CLottery.winner");
					CuiHelper.DestroyUi(player, "CLottery.reclam");
				});
			}			
		}
		#endregion*/
	}
}

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