C#:
using System;
using System.Collections.Generic;
using Oxide.Core;
using UnityEngine;
using Newtonsoft.Json;
using Oxide.Core.Plugins;
using Oxide.Game.Rust.Cui;
using System.Collections;
using System.Linq;
using Random = UnityEngine.Random;
using Oxide.Core.Libraries;
namespace Oxide.Plugins {
[Info("MultiEvents", "Mevent", "1.1.3")]
[Description("Maded by Mevent#4546")]
class MultiEvents : RustPlugin {
#region Fields
[PluginReference]
private readonly Plugin ImageLibrary;
private static string Layer = "UI_MultiEvents";
private double time;
public Timer Main;
public Timer DestroyTimer;
public Timer HelicopterStrafeTarget;
public Timer HelicopterTarget;
public BasePlayer winner = null;
public BasePlayer runner = null;
public List<string> Winners = new List<string>();
private bool hasStarted;
public string nowEvent = null;
private Dictionary<BasePlayer, float> PlayersTop = new Dictionary<BasePlayer, float>();
private List<LootContainer> LookingLoot = new List<LootContainer>();
private static MultiEvents instance;
private static Vector3 EventPosition = new Vector3(-(float) World.Size / 2, 400, -(float) World.Size / 2);
private static FoundationDrop cEvent = null;
MonumentInfo beginning_mission = null;
MonumentInfo end_mission = null;
public Item ItemForWinner = null;
#endregion
#region Config
private static ConfigData config;
private class ConfigData {
public class Interface {
[JsonProperty("Фоновый цвет")]
public string color;
[JsonProperty("Offset Min")]
public string oMin;
[JsonProperty("Offset Max")]
public string oMax;
}
public class EventSettings {
[JsonProperty("Настройки интерфейса событий")]
public Interface ui;
[JsonProperty("Сколько игроков требуется, чтобы начать событие?")]
public int MinPlayers;
[JsonProperty("Продолжительность события (в секундах)")]
public int TimeDelay;
[JsonProperty("Image URL")]
public string ImageUrl;
[JsonProperty("Настройки вознаграждений")]
public List<Loot> loot;
}
public class CollectionResourcesSettings : EventSettings {
}
public class HuntAnimalSettings : EventSettings {
[JsonProperty("Сколько очков дается за курицу?")]
public int chicken;
[JsonProperty("Сколько очков дается за волка?")]
public int wolf;
[JsonProperty("Сколько очков дается за кабана?")]
public int boar;
[JsonProperty("Сколько очков дается за оленя?")]
public int deer;
[JsonProperty("Сколько очков дается за лошадь?")]
public int horse;
[JsonProperty("Сколько очков дается за медведя?")]
public int bear;
}
public class Loot {
[JsonProperty("Награда это предмет?")]
public bool itemenabled;
[JsonProperty("Награда это деньги?")]
public bool cashenabled;
[JsonProperty("Пункт настройки")]
public List<List<Items>> items;
[JsonProperty("Настройка денег")]
public Cash cash;
}
public class Cash {
[JsonProperty("Функция вызова")]
public string function;
[JsonProperty("Имя плагина, чтобы дать")]
public string plugin;
[JsonProperty("Сумма стоимости мероприятия (следующий победитель получит меньше)")]
public int amount;
}
public class Items {
[JsonProperty("Название предмета (ShortName)")]
public string shortname;
[JsonProperty("Минимальное количество товара")]
public int minrate;
[JsonProperty("Максимальное количество товара")]
public int maxrate;
[JsonProperty("Это чертёж ?")]
public bool blueprint;
[JsonProperty("Название предмета (оставьте пустым для стандарта)")]
public string displayname;
[JsonProperty("SkinID (0 - дефолт)")]
public ulong skinid;
[JsonProperty("Состояние товара в процентах от 1 до 100 (0 - стандартно)")]
public int condition;
}
public class LookingLootSettings : EventSettings {
[JsonProperty("Какая добыча из бочек засчитывается на турнире?")]
public List<string> Barrels;
}
public class SpecialCargoSettings : EventSettings {
[JsonProperty("Время показа уведомления о запуске мероприятия")]
public float timeStart;
[JsonProperty("Время работы объявления объявления бегуна")]
public float timeNewRunner;
[JsonProperty("Имя маркера карты")]
public string MarkerName;
}
public class HelicopterPetSettings : EventSettings {
}
public class KingMountainSettings : EventSettings {
}
public class FoundationDropSettings : EventSettings {
[JsonProperty("Настройка интерфейса с информацией о количестве игроков и блоков")]
public Interface infoUI;
[JsonProperty("Размер арены в квадратах")]
public int ArenaSize;
[JsonProperty("Интервал между удалениями блоков")]
public float DelayDestroy;
[JsonProperty("Время ожидания игроков с момента объявления события")]
public int WaitTime;
[JsonProperty("Интенсивность создаваемого излучения")]
public float IntensityRadiation;
[JsonProperty("Отключить стандартное излучение при комнатной температуре (это необходимо, если у вас отключено излучение, плагин включит его снова, но удалит при комнатной температуре)?")]
public bool DisableDefaultRadiation;
[JsonProperty("Черные списки команд для игроков событий")]
public List<string> commands;
}
[JsonProperty("Задержка между событиями")]
public int Delay;
[JsonProperty("События доступны для игроков")]
public List<string> EnabledEvents;
[JsonProperty("Разрешение на запуск мероприятия")]
public string perm_admin;
[JsonProperty("Настройка события ЛЮБИМЧИК ВЕРТОЛЁТА")]
public HelicopterPetSettings HelicopterPet;
[JsonProperty("Настройка события ОХОТА ЖИВОТНЫХ")]
public HuntAnimalSettings HuntAnimal;
[JsonProperty("Настройка события ЦАРЬ ГОРЫ")]
public KingMountainSettings KingMountain;
[JsonProperty("Настройка события СБОР РЕСУРСОВ")]
public CollectionResourcesSettings CollectionResources;
[JsonProperty("Настройка события ПОИСК LOOT")]
public LookingLootSettings LookingLoot;
[JsonProperty("Настройка события СПЕЦИАЛЬНЫЙ ГРУЗ")]
public SpecialCargoSettings SpecialCargo;
[JsonProperty("Установка события ПАДАЮЩИЕ ПЛАТФОРМЫ")]
public FoundationDropSettings FoundationDrop;
}
private ConfigData GetDefaultConfig() {
return new ConfigData {
Delay = 3600, EnabledEvents = new List<string> {
"KingMountain", "CollectionResources", "HuntAnimal", "HelicopterPet", "LookingLoot", "SpecialCargo", "FoundationDrop"
}
, perm_admin = "multievents.admin", FoundationDrop = new ConfigData.FoundationDropSettings {
loot = new List<ConfigData.Loot> {
new ConfigData.Loot {
itemenabled = true, cashenabled = true, items = new List<List<ConfigData.Items>> {
new List<ConfigData.Items> {
new ConfigData.Items {
shortname = "autoturret", minrate = 1, maxrate = 1, blueprint = false, displayname = "", skinid = 0, condition = 0,
}
, new ConfigData.Items {
shortname = "metal.refined", minrate = 50, maxrate = 150, blueprint = false, displayname = "", skinid = 0, condition = 0,
}
}
}
, cash = new ConfigData.Cash {
function = "Deposit", plugin = "Economics", amount = 400,
}
}
,
}
, MinPlayers = 4, TimeDelay = 1800, ImageUrl = "https://i.imgur.com/B4DCBs2.png", ArenaSize = 10, DelayDestroy = 5f, WaitTime = 60, IntensityRadiation = 10f, DisableDefaultRadiation = false, ui = new ConfigData.Interface {
color = "0.024 0.016 0.17 0.7", oMin = "-225 -305", oMax = "-5 -5"
}
, infoUI = new ConfigData.Interface {
color = "0.024 0.016 0.17 0.7", oMin = "-225 -100", oMax = "-5 -5"
}
, commands = new List<string> {
"bp", "backpack", "skin", "skinbox", "rec", "tpa", "tpr", "sethome", "home", "kit", "remove"
}
}
, SpecialCargo = new ConfigData.SpecialCargoSettings {
MarkerName = "SPECIAL CARGO", MinPlayers = 4, TimeDelay = 1800, ImageUrl = "https://i.imgur.com/Dp9bMSl.png", timeNewRunner = 6, timeStart = 4, ui = new ConfigData.Interface {
color = "0.024 0.016 0.17 0.7", oMin = "-225 -305", oMax = "-5 -5"
}
, loot = new List<ConfigData.Loot> {
new ConfigData.Loot {
itemenabled = true, cashenabled = true, items = new List<List<ConfigData.Items>> {
new List<ConfigData.Items> {
new ConfigData.Items {
shortname = "autoturret", minrate = 1, maxrate = 1, blueprint = false, displayname = "", skinid = 0, condition = 0,
}
, new ConfigData.Items {
shortname = "metal.refined", minrate = 50, maxrate = 150, blueprint = false, displayname = "", skinid = 0, condition = 0,
}
}
}
, cash = new ConfigData.Cash {
function = "Deposit", plugin = "Economics", amount = 400,
}
}
,
}
,
}
, LookingLoot = new ConfigData.LookingLootSettings {
MinPlayers = 4, TimeDelay = 300, ImageUrl = "https://i.imgur.com/4ZOIs33.png", Barrels = new List<string> {
"assets/bundled/prefabs/autospawn/resource/loot/loot-barrel-1.prefab", "assets/bundled/prefabs/autospawn/resource/loot/loot-barrel-2.prefab", "assets/bundled/prefabs/radtown/loot_barrel_1.prefab", "assets/bundled/prefabs/radtown/loot_barrel_2.prefab", "assets/bundled/prefabs/radtown/oil_barrel.prefab"
}
, ui = new ConfigData.Interface {
color = "0.024 0.016 0.17 0.7", oMin = "-225 -305", oMax = "-5 -5"
}
, loot = new List<ConfigData.Loot> {
new ConfigData.Loot {
itemenabled = true, cashenabled = true, items = new List<List<ConfigData.Items>> {
new List<ConfigData.Items> {
new ConfigData.Items {
shortname = "autoturret", minrate = 1, maxrate = 1, blueprint = false, displayname = "", skinid = 0, condition = 0,
}
, new ConfigData.Items {
shortname = "metal.refined", minrate = 50, maxrate = 150, blueprint = false, displayname = "", skinid = 0, condition = 0,
}
}
}
, cash = new ConfigData.Cash {
function = "Deposit", plugin = "Economics", amount = 400,
}
}
,
}
,
}
, HelicopterPet = new ConfigData.HelicopterPetSettings {
MinPlayers = 4, TimeDelay = 300, ImageUrl = "https://i.imgur.com/owDanC1.png", ui = new ConfigData.Interface {
color = "0.024 0.016 0.17 0.7", oMin = "-225 -305", oMax = "-5 -5"
}
, loot = new List<ConfigData.Loot> {
new ConfigData.Loot {
itemenabled = true, cashenabled = true, items = new List<List<ConfigData.Items>> {
new List<ConfigData.Items> {
new ConfigData.Items {
shortname = "autoturret", minrate = 1, maxrate = 1, blueprint = false, displayname = "", skinid = 0, condition = 0,
}
, new ConfigData.Items {
shortname = "metal.refined", minrate = 50, maxrate = 150, blueprint = false, displayname = "", skinid = 0, condition = 0,
}
}
}
, cash = new ConfigData.Cash {
function = "Deposit", plugin = "Economics", amount = 400,
}
}
,
}
,
}
, HuntAnimal = new ConfigData.HuntAnimalSettings {
MinPlayers = 4, TimeDelay = 300, ImageUrl = "https://i.imgur.com/9gTw3kN.png", chicken = 1, wolf = 4, boar = 4, deer = 4, horse = 4, bear = 10, ui = new ConfigData.Interface {
color = "0.024 0.016 0.17 0.7", oMin = "-225 -305", oMax = "-5 -5"
}
, loot = new List<ConfigData.Loot> {
new ConfigData.Loot {
itemenabled = true, cashenabled = true, items = new List<List<ConfigData.Items>> {
new List<ConfigData.Items> {
new ConfigData.Items {
shortname = "autoturret", minrate = 1, maxrate = 1, blueprint = false, displayname = "", skinid = 0, condition = 0,
}
, new ConfigData.Items {
shortname = "metal.refined", minrate = 50, maxrate = 150, blueprint = false, displayname = "", skinid = 0, condition = 0,
}
}
}
, cash = new ConfigData.Cash {
function = "Deposit", plugin = "Economics", amount = 400,
}
}
, new ConfigData.Loot {
itemenabled = true, cashenabled = true, items = new List<List<ConfigData.Items>> {
new List<ConfigData.Items> {
new ConfigData.Items {
shortname = "autoturret", minrate = 1, maxrate = 1, blueprint = false, displayname = "", skinid = 0, condition = 0,
}
, new ConfigData.Items {
shortname = "metal.refined", minrate = 50, maxrate = 150, blueprint = false, displayname = "", skinid = 0, condition = 0,
}
}
}
, cash = new ConfigData.Cash {
function = "Deposit", plugin = "Economics", amount = 400,
}
}
, new ConfigData.Loot {
itemenabled = true, cashenabled = true, items = new List<List<ConfigData.Items>> {
new List<ConfigData.Items> {
new ConfigData.Items {
shortname = "autoturret", minrate = 1, maxrate = 1, blueprint = false, displayname = "", skinid = 0, condition = 0,
}
, new ConfigData.Items {
shortname = "metal.refined", minrate = 50, maxrate = 150, blueprint = false, displayname = "", skinid = 0, condition = 0,
}
}
}
, cash = new ConfigData.Cash {
function = "Deposit", plugin = "Economics", amount = 400,
}
}
,
}
,
}
, CollectionResources = new ConfigData.CollectionResourcesSettings {
MinPlayers = 4, TimeDelay = 300, ImageUrl = "https://i.imgur.com/FggJeaH.png", ui = new ConfigData.Interface {
color = "0.024 0.016 0.17 0.7", oMin = "-225 -305", oMax = "-5 -5"
}
, loot = new List<ConfigData.Loot> {
new ConfigData.Loot {
itemenabled = true, cashenabled = true, items = new List<List<ConfigData.Items>> {
new List<ConfigData.Items> {
new ConfigData.Items {
shortname = "autoturret", minrate = 1, maxrate = 1, blueprint = false, displayname = "", skinid = 0, condition = 0,
}
, new ConfigData.Items {
shortname = "metal.refined", minrate = 50, maxrate = 150, blueprint = false, displayname = "", skinid = 0, condition = 0,
}
}
}
, cash = new ConfigData.Cash {
function = "Deposit", plugin = "Economics", amount = 400,
}
}
, new ConfigData.Loot {
itemenabled = true, cashenabled = true, items = new List<List<ConfigData.Items>> {
new List<ConfigData.Items> {
new ConfigData.Items {
shortname = "autoturret", minrate = 1, maxrate = 1, blueprint = false, displayname = "", skinid = 0, condition = 0,
}
, new ConfigData.Items {
shortname = "metal.refined", minrate = 50, maxrate = 150, blueprint = false, displayname = "", skinid = 0, condition = 0,
}
}
}
, cash = new ConfigData.Cash {
function = "Deposit", plugin = "Economics", amount = 400,
}
}
, new ConfigData.Loot {
itemenabled = true, cashenabled = true, items = new List<List<ConfigData.Items>> {
new List<ConfigData.Items> {
new ConfigData.Items {
shortname = "autoturret", minrate = 1, maxrate = 1, blueprint = false, displayname = "", skinid = 0, condition = 0,
}
, new ConfigData.Items {
shortname = "metal.refined", minrate = 50, maxrate = 150, blueprint = false, displayname = "", skinid = 0, condition = 0,
}
}
}
, cash = new ConfigData.Cash {
function = "Deposit", plugin = "Economics", amount = 400,
}
}
,
}
,
}
, KingMountain = new ConfigData.KingMountainSettings {
MinPlayers = 4, TimeDelay = 300, ImageUrl = "https://i.imgur.com/dLWgxg7.png", ui = new ConfigData.Interface {
color = "0.024 0.016 0.17 0.7", oMin = "-225 -305", oMax = "-5 -5"
}
, loot = new List<ConfigData.Loot> {
new ConfigData.Loot {
itemenabled = true, cashenabled = true, items = new List<List<ConfigData.Items>> {
new List<ConfigData.Items> {
new ConfigData.Items {
shortname = "autoturret", minrate = 1, maxrate = 1, blueprint = false, displayname = "", skinid = 0, condition = 0,
}
, new ConfigData.Items {
shortname = "metal.refined", minrate = 50, maxrate = 150, blueprint = false, displayname = "", skinid = 0, condition = 0,
}
}
}
, cash = new ConfigData.Cash {
function = "Deposit", plugin = "Economics", amount = 400,
}
}
}
,
}
,
}
;
}
protected override void LoadConfig() {
base.LoadConfig();
try {
config = Config.ReadObject<ConfigData>();
if (config == null) LoadDefaultConfig();
}
catch {
LoadDefaultConfig();
}
SaveConfig();
}
protected override void LoadDefaultConfig() {
PrintWarning("Configuration file is corrupt(or not exists), creating new one!");
config = GetDefaultConfig();
}
protected override void SaveConfig() => Config.WriteObject(config);
#endregion
#region Initialization
void OnServerInitialized() {
PrintWarning(" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~");
PrintWarning($" {Name} v{Version} loading");
if (!ImageLibrary) {
PrintError(" Install plugin: 'ImageLibrary'");
Interface.Oxide.UnloadPlugin(Title);
return;
}
PrintWarning($" Plugin loaded - OK");
PrintWarning(" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~");
timer.Every(config.Delay + Random.Range(0, 1800), () => {
StartEvent(config.EnabledEvents.GetRandom());
}
);
permission.RegisterPermission(config.perm_admin, this);
ImageLibrary.Call("AddImage", config.CollectionResources.ImageUrl, "CollectionResources");
ImageLibrary.Call("AddImage", config.FoundationDrop.ImageUrl, "FoundationDrop");
ImageLibrary.Call("AddImage", config.HelicopterPet.ImageUrl, "HelicopterPet");
ImageLibrary.Call("AddImage", config.HuntAnimal.ImageUrl, "HuntAnimal");
ImageLibrary.Call("AddImage", config.KingMountain.ImageUrl, "KingMountain");
ImageLibrary.Call("AddImage", config.LookingLoot.ImageUrl, "LookingLoot");
ImageLibrary.Call("AddImage", config.SpecialCargo.ImageUrl, "SpecialCargo");
ImageLibrary.Call("AddImage", "https://i.imgur.com/Okt1BMH.png", "ME_Background_image");
ImageLibrary.Call("AddImage", "https://i.imgur.com/DpLldC8.png", "ME_Logo_image");
Unsubscribe(nameof(OnCollectiblePickup));
Unsubscribe(nameof(OnCropGather));
Unsubscribe(nameof(OnDispenserBonus));
Unsubscribe(nameof(OnDispenserGather));
Unsubscribe(nameof(OnEntityDeath));
Unsubscribe(nameof(OnLootEntity));
Unsubscribe(nameof(OnPlayerDie));
Unsubscribe(nameof(OnEntityKill));
Unsubscribe(nameof(ClearTeleport));
Unsubscribe(nameof(FoundationDrop));
Unsubscribe(nameof(InitializeFoundation));
Unsubscribe(nameof(DropFoundation));
Unsubscribe(nameof(Downgrader));
Unsubscribe(nameof(HeliPet));
Unsubscribe(nameof(SCmarker));
Unsubscribe(nameof(OnPlayerCommand));
instance = this;
}
void Unload() {
if (hasStarted) {
try {
DestroyEvent(nowEvent);
NextTick(() => {
PlayersTop.Clear();
for (int i = 0; i < BasePlayer.activePlayerList.Count; i++) {
var player = BasePlayer.activePlayerList[i];
CuiHelper.DestroyUi(player, Layer);
CuiHelper.DestroyUi(player, Layer + ".Notification");
CuiHelper.DestroyUi(player, Layer + ".SpecialCargo");
CuiHelper.DestroyUi(player, Layer + ".FoundationDrop.Play");
}
}
);
}
catch (NullReferenceException) {
if (PlayersTop.Count > 1) PlayersTop.Clear();
for (int i = 0; i < BasePlayer.activePlayerList.Count; i++) {
var player = BasePlayer.activePlayerList[i];
CuiHelper.DestroyUi(player, Layer);
CuiHelper.DestroyUi(player, Layer + ".Notification");
CuiHelper.DestroyUi(player, Layer + ".SpecialCargo");
CuiHelper.DestroyUi(player, Layer + ".FoundationDrop.Play");
}
UnityEngine.Object.FindObjectsOfType<BaseEntity>().Where(p => p.OwnerID == 98596 && !p.IsDestroyed).ToList().ForEach(s => s?.Kill());
UnityEngine.Object.FindObjectsOfType<Downgrader>().ToList().ForEach(s => s?.Kill());
UnityEngine.Object.FindObjectsOfType<SCmarker>().ToList().ForEach(s => s?.Kill());
if (RadiationZones.ContainsKey(cEvent.BlockList.SelectMany(p => p).Last().GetInstanceID())) {
UnityEngine.Object.Destroy(RadiationZones[cEvent.BlockList.SelectMany(p => p).Last().GetInstanceID()].zone);
RadiationZones.Remove(cEvent.BlockList.SelectMany(p => p).Last().GetInstanceID());
}
}
}
}
#endregion
#region Functions
void StartEvent(string type, BasePlayer target = null) {
if (hasStarted && !string.IsNullOrEmpty(nowEvent)) DestroyEvent(nowEvent);
nowEvent = type;
Main?.Destroy();
DestroyTimer?.Destroy();
switch (type) {
case "KingMountain" : {
if (BasePlayer.activePlayerList.Count < config.KingMountain.MinPlayers && target == null) return;
for (int i = 0; i < BasePlayer.activePlayerList.Count; i++) TopUI(BasePlayer.activePlayerList[i], "all", GetMessage(type, BasePlayer.activePlayerList[i].UserIDString), oMin : config.KingMountain.ui.oMin, oMax : config.KingMountain.ui.oMax, color : config.KingMountain.ui.color);
time = config.KingMountain.TimeDelay + GrabCurrentTime();
Main = timer.Repeat(1, (int) (time - GrabCurrentTime()), () => {
var list = PlayersTop.OrderByDescending(p => p.Value).Take(8).ToList();
for (int i = 0; i < BasePlayer.activePlayerList.Count; i++) {
var player = BasePlayer.activePlayerList[i];
if (!player.IsBuildingAuthed() && !player.GetMounted() && !player.IsFlying) {
if (!PlayersTop.ContainsKey(player)) PlayersTop.Add(player, player.transform.position.y);
else PlayersTop[player] = player.transform.position.y;
}
TopUI(player, "refresh", list : list);
}
}
);
DestroyTimer = timer.Once(config.KingMountain.TimeDelay, () => {
DestroyEvent(nowEvent);
}
);
}
break;
case "CollectionResources" : {
if (BasePlayer.activePlayerList.Count < config.CollectionResources.MinPlayers && target == null) return;
Subscribe(nameof(OnCollectiblePickup));
Subscribe(nameof(OnCropGather));
Subscribe(nameof(OnDispenserBonus));
Subscribe(nameof(OnDispenserGather));
for (int i = 0; i < BasePlayer.activePlayerList.Count; i++) TopUI(BasePlayer.activePlayerList[i], "all", GetMessage(type, BasePlayer.activePlayerList[i].UserIDString), oMin : config.CollectionResources.ui.oMin, oMax : config.CollectionResources.ui.oMax, color : config.CollectionResources.ui.color);
time = config.CollectionResources.TimeDelay + GrabCurrentTime();
Main = timer.Repeat(1, (int) (time - GrabCurrentTime()), () => {
var list = PlayersTop.OrderByDescending(p => p.Value).Take(8).ToList();
for (int i = 0; i < BasePlayer.activePlayerList.Count; i++) TopUI(BasePlayer.activePlayerList[i], "refresh", list : list);
}
);
DestroyTimer = timer.Once(config.CollectionResources.TimeDelay, () => {
DestroyEvent(nowEvent);
}
);
}
break;
case "HuntAnimal" : {
if (BasePlayer.activePlayerList.Count < config.HuntAnimal.MinPlayers && target == null) return;
Subscribe(nameof(OnEntityDeath));
for (int i = 0; i < BasePlayer.activePlayerList.Count; i++) TopUI(BasePlayer.activePlayerList[i], "all", GetMessage(type, BasePlayer.activePlayerList[i].UserIDString), oMin : config.HuntAnimal.ui.oMin, oMax : config.HuntAnimal.ui.oMax, color : config.HuntAnimal.ui.color);
time = config.HuntAnimal.TimeDelay + GrabCurrentTime();
Main = timer.Repeat(1, (int) (time - GrabCurrentTime()), () => {
var list = PlayersTop.OrderByDescending(p => p.Value).Take(8).ToList();
for (int i = 0; i < BasePlayer.activePlayerList.Count; i++) TopUI(BasePlayer.activePlayerList[i], "refresh", list : list);
}
);
DestroyTimer = timer.Once(config.HuntAnimal.TimeDelay, () => {
DestroyEvent(nowEvent);
}
);
}
break;
case "HelicopterPet" : {
if (BasePlayer.activePlayerList.Count < config.HelicopterPet.MinPlayers && target == null) return;
Subscribe(nameof(OnEntityKill));
Subscribe(nameof(HeliPet));
for (int i = 0; i < BasePlayer.activePlayerList.Count; i++) TopUI(BasePlayer.activePlayerList[i], "all", GetMessage(type, BasePlayer.activePlayerList[i].UserIDString), oMin : config.HelicopterPet.ui.oMin, oMax : config.HelicopterPet.ui.oMax, color : config.HelicopterPet.ui.color);
time = config.HelicopterPet.TimeDelay + GrabCurrentTime();
BaseHelicopter heli = GameManager.server.CreateEntity("assets/prefabs/npc/patrol helicopter/patrolhelicopter.prefab", new Vector3(), new Quaternion(), true) as BaseHelicopter;
heli.OwnerID = 999999999;
heli.Spawn();
heli.transform.position = new Vector3(0, 350, 0);
heli.gameObject.AddComponent<HeliPet>();
Main = timer.Repeat(1, (int) (time - GrabCurrentTime()), () => {
var list = PlayersTop.OrderByDescending(p => p.Value).Take(8).ToList();
for (int i = 0; i < BasePlayer.activePlayerList.Count; i++) TopUI(BasePlayer.activePlayerList[i], "refresh", list : list);
}
);
DestroyTimer = timer.Once(config.HelicopterPet.TimeDelay, () => {
DestroyEvent(nowEvent);
}
);
}
break;
case "LookingLoot" : {
if (BasePlayer.activePlayerList.Count < config.LookingLoot.MinPlayers && target == null) return;
Subscribe(nameof(OnLootEntity));
Subscribe(nameof(OnEntityDeath));
for (int i = 0; i < BasePlayer.activePlayerList.Count; i++) TopUI(BasePlayer.activePlayerList[i], "all", GetMessage(type, BasePlayer.activePlayerList[i].UserIDString), oMin : config.LookingLoot.ui.oMin, oMax : config.LookingLoot.ui.oMax, color : config.LookingLoot.ui.color);
time = config.LookingLoot.TimeDelay + GrabCurrentTime();
Main = timer.Repeat(1, (int) (time - GrabCurrentTime()), () => {
var list = PlayersTop.OrderByDescending(p => p.Value).Take(8).ToList();
for (int i = 0; i < BasePlayer.activePlayerList.Count; i++) TopUI(BasePlayer.activePlayerList[i], "refresh", list : list);
}
);
DestroyTimer = timer.Once(config.LookingLoot.TimeDelay, () => {
DestroyEvent(nowEvent);
}
);
}
break;
case "SpecialCargo" : {
if (BasePlayer.activePlayerList.Count < config.SpecialCargo.MinPlayers && target == null) return;
Subscribe(nameof(OnPlayerDie));
Subscribe(nameof(SCmarker));
time = config.SpecialCargo.TimeDelay + GrabCurrentTime();
List<MonumentInfo> monuments = new List<MonumentInfo>();
foreach (var monument in UnityEngine.Object.FindObjectsOfType<MonumentInfo>()) {
monuments.Add(monument);
}
beginning_mission = monuments.GetRandom();
monuments.Remove(beginning_mission);
end_mission = monuments.GetRandom();
for (int i = 0; i < BasePlayer.activePlayerList.Count; i++) UI_Notification(BasePlayer.activePlayerList[i], GetMessage("SpecialCargo.New", BasePlayer.activePlayerList[i].UserIDString, beginning_mission.displayPhrase.english), ".Notification.New");
timer.Once(config.SpecialCargo.timeStart, () => {
for (int i = 0; i < BasePlayer.activePlayerList.Count; i++) CuiHelper.DestroyUi(BasePlayer.activePlayerList[i], Layer + ".Notification.New");
}
);
//add image to map
beginning_mission.gameObject.AddComponent<SCmarker>().spawnMarker();
Main = timer.Repeat(1, (int) (time - GrabCurrentTime()), () => {
for (int i = 0; i < BasePlayer.activePlayerList.Count; i++) {
var player = BasePlayer.activePlayerList[i];
if (runner == null) if (Vector3.Distance(beginning_mission.transform.position, player.transform.position) < 100f) {
runner = player;
UI_Notification(runner, GetMessage("SpecialCargo.CreateRunner", runner.UserIDString, end_mission.displayPhrase.english, GetGridString(end_mission.transform.position)), ".Notification.CreateRunner");
timer.Once(config.SpecialCargo.timeNewRunner, () => CuiHelper.DestroyUi(runner, Layer + ".Notification.CreateRunner"));
beginning_mission.gameObject.GetComponent<SCmarker>()?.Kill();
player.gameObject.AddComponent<SCPlayerMarker>()?.SpawnMarker();
TopUI(runner, nowEvent);
}
if (runner == player && Vector3.Distance(end_mission.transform.position, player.transform.position) < 100f) DestroyEvent(nowEvent);
}
}
);
DestroyTimer = timer.Once(config.SpecialCargo.TimeDelay, () => {
DestroyEvent(nowEvent);
}
);
}
break;
case "FoundationDrop" : {
if (BasePlayer.activePlayerList.Count < config.FoundationDrop.MinPlayers && target == null) return;
Subscribe(nameof(ClearTeleport));
Subscribe(nameof(FoundationDrop));
Subscribe(nameof(InitializeFoundation));
Subscribe(nameof(DropFoundation));
Subscribe(nameof(Downgrader));
Subscribe(nameof(OnPlayerCommand));
time = config.FoundationDrop.WaitTime + GrabCurrentTime();
cEvent = new FoundationDrop {
Started = false, StartTime = time
}
;
ServerMgr.Instance.StartCoroutine(InitializeFoundation(config.FoundationDrop.WaitTime));
}
break;
default : break;
}
hasStarted = true;
}
void DestroyEvent(string type) {
Main?.Destroy();
DestroyTimer?.Destroy();
var messageKEY = string.Empty;
var winns = string.Empty;
switch (type) {
case "KingMountain" : if (PlayersTop.Count != 0) {
var list = PlayersTop.OrderByDescending(p => p.Value).Take(config.KingMountain.loot.Count).ToList();
for (int i = 0; i < list.Count; i++) {
var winner = list[i];
DropItem(winner.Key, nowEvent, i);
Winners.Add(winner.Key.displayName);
}
}
break;
case "CollectionResources" : Unsubscribe(nameof(OnCollectiblePickup));
Unsubscribe(nameof(OnCropGather));
Unsubscribe(nameof(OnDispenserBonus));
Unsubscribe(nameof(OnDispenserGather));
if (PlayersTop.Count != 0) {
var list = PlayersTop.OrderByDescending(p => p.Value).Take(config.CollectionResources.loot.Count).ToList();
for (int i = 0; i < list.Count; i++) {
var winner = list[i];
DropItem(winner.Key, nowEvent, i);
Winners.Add(winner.Key.displayName);
}
}
break;
case "HuntAnimal" : Unsubscribe(nameof(OnEntityDeath));
if (PlayersTop.Count != 0) {
var list = PlayersTop.OrderByDescending(p => p.Value).Take(config.HuntAnimal.loot.Count).ToList();
for (int i = 0; i < list.Count; i++) {
var winner = list[i];
DropItem(winner.Key, nowEvent, i);
Winners.Add(winner.Key.displayName);
}
}
break;
case "HelicopterPet" : Unsubscribe(nameof(OnEntityKill));
Unsubscribe(nameof(HeliPet));
foreach (var check in BaseNetworkable.serverEntities) {
if (check is BaseHelicopter && (check as BaseHelicopter).OwnerID == 999999999) {
check?.Kill();
}
}
if (PlayersTop.Count != 0) {
var list = PlayersTop.OrderByDescending(p => p.Value).Take(config.HelicopterPet.loot.Count).ToList();
for (int i = 0; i < list.Count; i++) {
var winner = list[i];
DropItem(winner.Key, nowEvent, i);
Winners.Add(winner.Key.displayName);
}
}
break;
case "LookingLoot" : Unsubscribe(nameof(OnLootEntity));
Unsubscribe(nameof(OnEntityDeath));
if (PlayersTop.Count != 0) {
var list = PlayersTop.OrderByDescending(p => p.Value).Take(config.LookingLoot.loot.Count).ToList();
for (int i = 0; i < list.Count; i++) {
var winner = list[i];
DropItem(winner.Key, nowEvent, i);
Winners.Add(winner.Key.displayName);
}
}
break;
case "SpecialCargo" : UnityEngine.Object.FindObjectsOfType<SCmarker>().ToList().ForEach(s => s?.Kill());
Unsubscribe(nameof(OnPlayerDie));
Unsubscribe(nameof(SCmarker));
if (runner != null) {
winner = runner;
DropItem(winner, type);
runner.gameObject.GetComponent<SCPlayerMarker>()?.Kill();
}
break;
case "FoundationDrop" : cEvent.FinishEvent();
cEvent = null;
Unsubscribe(nameof(ClearTeleport));
Unsubscribe(nameof(FoundationDrop));
Unsubscribe(nameof(InitializeFoundation));
Unsubscribe(nameof(DropFoundation));
Unsubscribe(nameof(Downgrader));
Unsubscribe(nameof(OnPlayerCommand));
break;
}
if (PlayersTop.Count == 0 && winner == null) {
for (int i = 0; i < BasePlayer.activePlayerList.Count; i++) {
var player = BasePlayer.activePlayerList[i];
CuiHelper.DestroyUi(player, Layer);
UI_Notification(player, GetMessage("WINNER.NOTFOUND", player.UserIDString));
}
timer.Once(4, () => {
for (int i = 0; i < BasePlayer.activePlayerList.Count; i++) CuiHelper.DestroyUi(BasePlayer.activePlayerList[i], Layer + ".Notification");
}
);
}
else {
messageKEY = Winners.Count > 1 ? "EVENT.END.MULTI" : "EVENT.END";
winns = Winners.Count > 1 ? string.Join(", ", Winners.ToArray()) : Winners.First();
for (int i = 0; i < BasePlayer.activePlayerList.Count; i++) {
var player = BasePlayer.activePlayerList[i];
CuiHelper.DestroyUi(player, Layer);
CuiHelper.DestroyUi(player, Layer + ".SpecialCargo");
CuiHelper.DestroyUi(player, Layer + ".FoundationDrop.Play");
UI_Notification(player, winner == player ? GetMessage("EVENT.YOUWINNER", player.UserIDString) : GetMessage(messageKEY, player.UserIDString, GetMessage(type, player.UserIDString), winns));
}
timer.Once(4, () => {
PlayersTop.Clear();
for (int i = 0; i < BasePlayer.activePlayerList.Count; i++) CuiHelper.DestroyUi(BasePlayer.activePlayerList[i], Layer + ".Notification");
}
);
}
NextTick(() => {
if (type != "FoundationDrop") {
winner = null;
nowEvent = null;
hasStarted = false;
}
else {
if (winner == null) {
nowEvent = null;
hasStarted = false;
}
}
runner = null;
beginning_mission = null;
end_mission = null;
winns = string.Empty;
PlayersTop.Clear();
LookingLoot.Clear();
Winners.Clear();
messageKEY = "EVENT.END";
HelicopterStrafeTarget?.Destroy();
HelicopterTarget?.Destroy();
}
);
}
private void DropItem(BasePlayer player, string type, int temp = 0) {
ConfigData.Items item = null;
ConfigData.Cash cash = null;
switch (type) {
case "KingMountain" : if (config.KingMountain.loot[temp].itemenabled) {
for (int i = 0; i < config.KingMountain.loot[temp].items.Count; i++) {
item = config.KingMountain.loot[temp].items[i].GetRandom();
}
}
if (config.KingMountain.loot[temp].cashenabled) cash = config.KingMountain.loot[temp].cash;
break;
case "CollectionResources" : if (config.CollectionResources.loot[temp].itemena
// ... [Code preview truncated due to length. Full source in attached file] ...