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

FREE ArmoredTrain : 1.9.7 1.9.7

Нет прав для скачивания
C#:
using Facepunch;
using System;
using System.IO;
using System.Reflection;
using System.Collections;
using System.Collections.Generic;
using Oxide.Core;
using Oxide.Core.Plugins;
using Oxide.Game.Rust.Cui;
using Oxide.Plugins.ArmoredTrainExtensionMethods;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using UnityEngine;
using UnityEngine.AI;
using UnityEngine.Networking;
using Time = UnityEngine.Time;
using static TrainEngine;
using static ProtoBuf.PatternFirework;
using static BaseCombatEntity;
using Random = UnityEngine.Random;
namespace Oxide.Plugins {
    [Info("ArmoredTrain", "Adem", "1.9.7")]
    public class ArmoredTrain : RustPlugin {
#region Variables
        private const bool En = false;
        private static ArmoredTrain _ins;
        private EventController _eventController;
        private ProtectionProperties _protection;
        [PluginReference]
        private Plugin NpcSpawn, PveMode, GUIAnnouncements, Notify, DiscordMessages, DynamicPVP, Economics, ServerRewards, IQEconomic, TrainHomes, AlphaLoot, CustomLoot, Loottable;
        private readonly HashSet<string> _subscribeMethods = new HashSet<string> {
            "OnEntitySpawned", "OnEntityTakeDamage", "OnEntityDeath", "OnEntityEnter", "CanHelicopterTarget", "OnCustomNpcTarget", "CanBradleyApcTarget", "OnTrainCarUncouple", "CanTrainCarCouple", "CanPickupEntity", "CanMountEntity", "OnSwitchToggle", "OnSwitchToggled", "OnCounterModeToggle", "OnCounterTargetChange", "OnPlayerSleep", "CanLootEntity", "OnSamSiteModeToggle", "OnTurretAuthorize", "CanHackCrate", "OnLootEntity", "OnLootEntityEnd", "OnCorpsePopulate", "OnCrateSpawned", "OnContainerPopulate", "CanPopulateLoot", "OnCustomLootContainer", "OnCustomLootNPC", "CanEntityBeTargeted", "CanEntityTakeDamage", "OnCreateDynamicPVP", "SetOwnerPveMode", "ClearOwnerPveMode", "CanBradleySpawnNpc", "CanHelicopterSpawnNpc"
        }
        ;
        private EventHeli _eventHeli;
#endregion Variablesa
#region ExternalAPI
        private bool IsArmoredTrainActive() {
            return EventLauncher.IsEventActive();
        }
        private bool StopArmoredTrain() {
            if (!EventLauncher.IsEventActive()) return false;
            //eventController.StopMoving();
            return true;
        }
        private bool StartArmoredTrainEvent() {
            if (EventLauncher.IsEventActive()) return false;
            EventLauncher.DelayStartEvent();
            return true;
        }
        private bool EndArmoredTrainEvent() {
            if (EventLauncher.IsEventActive()) return false;
            EventLauncher.StopEvent();
            return true;
        }
        private Vector3 ArmoredTrainLocomotivePosition() {
            if (!EventLauncher.IsEventActive()) return Vector3.zero;
            return _eventController.GetEventPosition();
        }
        private bool IsTrainBradley(ulong netID) {
            return EventLauncher.IsEventActive() && _eventController.IsTrainBradley(netID);
        }
        private bool IsTrainHeli(ulong netID) {
            if (!EventLauncher.IsEventActive()) return false;
            return EventHeli.GetEventHeliByNetId(netID) != null;
        }
        private bool IsTrainCrate(ulong netID) {
            return _eventController != null && _eventController.IsEventCrate(netID);
        }
        private bool IsTrainSamSite(ulong netID) {
            return EventLauncher.IsEventActive() && _eventController.IsTrainSamSite(netID);
        }
        private bool IsTrainWagon(ulong netID) {
            return EventLauncher.IsEventActive() && _eventController.IsTrainWagon(netID);
        }
        private bool IsTrainTurret(ulong netID) {
            return EventLauncher.IsEventActive() && _eventController.IsTrainTurret(netID);
        }
#endregion ExternalAPI
#region Hooks
        private void Init() {
            Unsubscribes();
        }
        private void OnServerInitialized() {
            _ins = this;
            if (!NpcSpawnManager.IsNpcSpawnReady()) return;
            LoadDefaultMessages();
            UpdateConfig();
            PrefabController.CachePrefabs();
            GuiManager.LoadImages();
            WagonCustomizer.LoadCurrentCustomizationProfile();
            EventLauncher.AutoStartEvent();
            _protection = ScriptableObject.CreateInstance<ProtectionProperties>();
            _protection.Add(1);
        }
        private void Unload() {
            EventLauncher.StopEvent(true);
            _ins = null;
        }
        private void OnEntitySpawned(HelicopterDebris entity) {
            if (!entity.IsExists() || entity.ShortPrefabName != "servergibs_bradley") return;
            if (Vector3.Distance(_eventController.GetEventPosition(), entity.transform.position) < _eventController.EventConfig.ZoneRadius) entity.Kill();
        }
        private object OnEntityTakeDamage(TrainCar trainCar, HitInfo info) {
            if (trainCar == null || trainCar.net == null || info == null) return null;
            if (_eventController.IsTrainWagon(trainCar.net.ID.Value)) {
                if (info.InitiatorPlayer.IsRealPlayer()) _eventController.OnTrainAttacked(info.InitiatorPlayer);
                return true;
            }
            return null;
        }
        private object OnEntityTakeDamage(PatrolHelicopter patrolHelicopter, HitInfo info) {
            if (patrolHelicopter == null || patrolHelicopter.net == null || info == null || !info.InitiatorPlayer.IsRealPlayer()) return null;
            EventHeli eventHeli = EventHeli.GetEventHeliByNetId(patrolHelicopter.net.ID.Value);
            if (eventHeli == null) return null;
            if (!EventController.IsPlayerCanDealDamage(info.InitiatorPlayer, patrolHelicopter, true)) return true;
            eventHeli.OnHeliAttacked(info.InitiatorPlayer.userID);
            _eventController.OnTrainAttacked(info.InitiatorPlayer);
            return null;
        }
        private object OnEntityTakeDamage(BradleyAPC bradley, HitInfo info) {
            if (bradley == null || bradley.net == null || info == null) return null;
            if (!_eventController.IsTrainBradley(bradley.net.ID.Value)) return null;
            if (!info.InitiatorPlayer.IsRealPlayer()) return true;
            if (!EventController.IsPlayerCanDealDamage(info.InitiatorPlayer, bradley, true)) return true;
            _eventController.OnTrainAttacked(info.InitiatorPlayer);
            return null;
        }
        private object OnEntityTakeDamage(AutoTurret autoTurret, HitInfo info) {
            if (autoTurret == null || autoTurret.net == null || info == null) return null;
            if (!_eventController.IsTrainTurret(autoTurret.net.ID.Value)) return null;
            if (!info.InitiatorPlayer.IsRealPlayer()) return true;
            if (!EventController.IsPlayerCanDealDamage(info.InitiatorPlayer, autoTurret, true)) return true;
            _eventController.OnTrainAttacked(info.InitiatorPlayer);
            return null;
        }
        private object OnEntityTakeDamage(SamSite samSite, HitInfo info) {
            if (samSite == null || samSite.net == null || info == null) return null;
            if (!_eventController.IsTrainSamSite(samSite.net.ID.Value)) return null;
            if (!info.InitiatorPlayer.IsRealPlayer()) return true;
            if (!EventController.IsPlayerCanDealDamage(info.InitiatorPlayer, samSite, true)) return true;
            _eventController.OnTrainAttacked(info.InitiatorPlayer);
            return null;
        }
        private object OnEntityTakeDamage(ElectricSwitch electricSwitch, HitInfo info) {
            if (electricSwitch == null || electricSwitch.net == null || info == null) return null;
            if (_eventController.IsTrainSwitch(electricSwitch.net.ID.Value)) return true;
            return null;
        }
        private object OnEntityTakeDamage(PowerCounter powerCounter, HitInfo info) {
            if (powerCounter == null || powerCounter.net == null || info == null) return null;
            if (_eventController.IsTrainCounter(powerCounter.net.ID.Value)) return true;
            return null;
        }
        private object OnEntityTakeDamage(BasePlayer player, HitInfo info) {
            ScientistNPC scientistNpc = player as ScientistNPC;
            if (scientistNpc != null) {
                if (scientistNpc == null || scientistNpc.net == null || info == null || !info.InitiatorPlayer.IsRealPlayer()) return null;
                if (NpcSpawnManager.GetScientistByNetId(scientistNpc.net.ID.Value) == null) return null;
                if (!EventController.IsPlayerCanDealDamage(info.InitiatorPlayer, scientistNpc, true)) {
                    info.damageTypes.ScaleAll(0);
                    _eventController.OnTrainAttacked(info.InitiatorPlayer);
                    return true;
                }
                if (scientistNpc.isMounted) {
                    if (!EventController.IsPlayerCanStopTrain(info.InitiatorPlayer, true)) {
                        info.damageTypes.ScaleAll(0);
                        return true;
                    }
                    if (_config.MainConfig.AllowDriverDamage) {
                        info.damageTypes.ScaleAll(10);
                    }
                    else {
                        info.damageTypes.ScaleAll(0);
                        return true;
                    }
                }
                _eventController.OnTrainAttacked(info.InitiatorPlayer);
            }
            else {
                if (!player.IsRealPlayer() || !player.IsSleeping() || info == null || info.InitiatorPlayer == null) return null;
                if (!info.InitiatorPlayer.isMounted || info.InitiatorPlayer.userID.IsSteamId() || info.InitiatorPlayer.net == null) return null;
                if (NpcSpawnManager.GetScientistByNetId(info.InitiatorPlayer.net.ID.Value)) return true;
            }
            return null;
        }
        private void OnEntityDeath(PatrolHelicopter patrolHelicopter, HitInfo info) {
            if (patrolHelicopter == null || patrolHelicopter.net == null) return;
            EventHeli eventHeli = EventHeli.GetEventHeliByNetId(patrolHelicopter.net.ID.Value);
            if (eventHeli != null && eventHeli.lastAttackedPlayer != 0) EconomyManager.AddBalance(eventHeli.lastAttackedPlayer, _config.SupportedPluginsConfig.EconomicsConfig.HeliPoint);
        }
        private void OnEntityDeath(AutoTurret autoTurret, HitInfo info) {
            if (autoTurret == null || autoTurret.net == null || info == null || !info.InitiatorPlayer.IsRealPlayer()) return;
            if (_eventController.IsTrainTurret(autoTurret.net.ID.Value)) EconomyManager.AddBalance(info.InitiatorPlayer.userID, _config.SupportedPluginsConfig.EconomicsConfig.TurretPoint);
        }
        private void OnEntityDeath(BradleyAPC bradleyApc, HitInfo info) {
            if (bradleyApc == null || bradleyApc.net == null || info == null || !info.InitiatorPlayer.IsRealPlayer()) return;
            if (_eventController.IsTrainBradley(bradleyApc.net.ID.Value)) EconomyManager.AddBalance(info.InitiatorPlayer.userID, _config.SupportedPluginsConfig.EconomicsConfig.BradleyPoint);
        }
        private void OnEntityDeath(ScientistNPC scientistNpc, HitInfo info) {
            if (scientistNpc == null || scientistNpc.net == null || info == null || !info.InitiatorPlayer.IsRealPlayer()) return;
            if (NpcSpawnManager.GetScientistByNetId(scientistNpc.net.ID.Value) != null) {
                if (scientistNpc.isMounted) _eventController.OnDriverKilled(info.InitiatorPlayer);
                EconomyManager.AddBalance(info.InitiatorPlayer.userID, _config.SupportedPluginsConfig.EconomicsConfig.NpcPoint);
            }
        }
        private object OnEntityEnter(TriggerTrainCollisions trigger, TrainCar trainCar) {
            if (!_ins._config.MainConfig.DestroyWagons || trigger == null || !trigger.owner.IsExists() || trigger.owner.net == null || !trainCar.IsExists() || trainCar.net == null) return null;
            if (!_eventController.IsTrainWagon(trainCar.net.ID.Value) || _eventController.IsTrainWagon(trigger.owner.net.ID.Value)) return null;
            if (trainCar is TrainEngine) {
                if (_eventController.IsReverse()) return null;
            }
            else if (!_eventController.IsReverse()) {
                return null;
            }
            if (!trigger.owner.IsExists() || !_ins._config.MainConfig.DestroyWagons) return null;
            if (_ins.plugins.Exists("TrainHomes") && (bool)TrainHomes.Call("IsTrainHomes", trigger.owner.net.ID.Value) && !(bool)TrainHomes.Call("IsFreeWagon", trigger.owner.net.ID.Value)) return null;
            _ins.NextTick(() => trigger.owner.Kill(BaseNetworkable.DestroyMode.Gib));
            return null;
        }
        private object CanHelicopterTarget(PatrolHelicopterAI heli, BasePlayer player) {
            if (heli == null || heli.helicopterBase == null || heli.helicopterBase.net == null) return null;
            EventHeli eventHeli = EventHeli.GetEventHeliByNetId(heli.helicopterBase.net.ID.Value);
            if (eventHeli != null && !eventHeli.IsHeliCanTarget()) return false;
            if (player.IsSleeping() || (player.InSafeZone() && !player.IsHostile())) return false;
            return null;
        }
        private object OnCustomNpcTarget(ScientistNPC scientistNpc, BasePlayer player) {
            if (_eventController == null || scientistNpc == null || scientistNpc.net == null) return null;
            if (NpcSpawnManager.GetScientistByNetId(scientistNpc.net.ID.Value) == null) return null;
            if (!_eventController.IsAggressive()) return false;
            if (player.IsSleeping() || (player.InSafeZone() && !player.IsHostile())) return false;
            return null;
        }
        private object CanBradleyApcTarget(BradleyAPC bradley, BaseEntity entity) {
            if (bradley == null || bradley.net == null) return null;
            if (!_eventController.IsTrainBradley(bradley.net.ID.Value)) return null;
            BasePlayer targetPlayer = entity as BasePlayer;
            if (!targetPlayer.IsRealPlayer()) return false;
            if (targetPlayer.IsSleeping() || (targetPlayer.InSafeZone() && !targetPlayer.IsHostile())) return false;
            return null;
        }
        private object OnTrainCarUncouple(TrainCar trainCar, BasePlayer player) {
            if (trainCar == null || player == null || trainCar.net == null) return null;
            if (_eventController.IsTrainWagon(trainCar.net.ID.Value)) return true;
            return null;
        }
        private object CanTrainCarCouple(TrainCar trainCar1, TrainCar trainCar2) {
            if (trainCar1 == null || trainCar1.net == null || trainCar2 == null || trainCar2.net == null) return null;
            if (_eventController.IsTrainWagon(trainCar1.net.ID.Value) && !_eventController.CanConnectToTrainWagon(trainCar1)) return false;
            if (_eventController.IsTrainWagon(trainCar2.net.ID.Value) && !_eventController.CanConnectToTrainWagon(trainCar2)) return false;
            return null;
        }
        private object CanPickupEntity(BasePlayer player, ElectricSwitch electricSwitch) {
            if (player == null || electricSwitch == null || electricSwitch.net == null) return null;
            if (_eventController.IsTrainSwitch(electricSwitch.net.ID.Value)) return false;
            return null;
        }
        private object CanPickupEntity(BasePlayer player, PowerCounter powerCounter) {
            if (player == null || powerCounter == null || powerCounter.net == null) return null;
            if (_eventController.IsTrainCounter(powerCounter.net.ID.Value)) return false;
            return null;
        }
        private object CanMountEntity(BasePlayer player, BaseVehicleSeat entity) {
            if (!player.IsRealPlayer() || !entity.IsExists()) return null;
            TrainCar trainCar = entity.VehicleParent() as TrainCar;
            if (!trainCar.IsExists() || trainCar.net == null) return null;
            if (_eventController.IsTrainWagon(trainCar.net.ID.Value)) return true;
            return null;
        }
        private object OnSwitchToggle(ElectricSwitch electricSwitch, BasePlayer player) {
            if (!electricSwitch.IsExists() || electricSwitch.net == null || player == null) return null;
            if (!_eventController.IsTrainSwitch(electricSwitch.net.ID.Value)) return null;
            if (!electricSwitch.IsOn() && (!_ins._config.MainConfig.AllowEnableMovingByHandbrake || !_eventController.IsDriverAlive())) return true;
            if (electricSwitch.IsOn() && !EventController.IsPlayerCanStopTrain(player, true)) return true;
            return null;
        }
        private void OnSwitchToggled(ElectricSwitch electricSwitch, BasePlayer player) {
            if (!electricSwitch.IsExists() || electricSwitch.net == null || player == null) return;
            if (!_eventController.IsTrainSwitch(electricSwitch.net.ID.Value)) return;
            _eventController.OnSwitchToggled(player);
        }
        private object OnCounterModeToggle(PowerCounter counter, BasePlayer player, bool mode) {
            if (!counter.IsExists() || counter.net == null || player == null) return null;
            if (_eventController.IsTrainCounter(counter.net.ID.Value)) return true;
            return null;
        }
        private object OnCounterTargetChange(PowerCounter counter, BasePlayer player, int targetNumber) {
            if (!counter.IsExists() || counter.net == null || player == null) return null;
            if (_eventController.IsTrainCounter(counter.net.ID.Value)) return true;
            return null;
        }
        private void OnPlayerSleep(BasePlayer player) {
            if (player == null) return;
            ZoneController.OnPlayerLeaveZone(player);
        }
        private object CanLootEntity(BasePlayer player, LootContainer container) {
            if (player == null || container == null || container.net == null) return null;
            if (!_eventController.IsEventCrate(container.net.ID.Value)) return null;
            if (!_eventController.IsAggressive()) {
                _eventController.MakeAggressive();
                return true;
            }
            if (!_eventController.IsPlayerCanLoot(player, true)) return true;
            return null;
        }
        private object CanLootEntity(BasePlayer player, SamSite samSite) {
            if (player == null || samSite == null || samSite.net == null) return null;
            if (!_eventController.IsTrainSamSite(samSite.net.ID.Value)) return null;
            if (!_eventController.IsAggressive()) _eventController.MakeAggressive();
            return true;
        }
        private object OnSamSiteModeToggle(SamSite samSite, BasePlayer player, bool isEnable) {
            if (player == null || samSite == null || samSite.net == null) return null;
            if (!_eventController.IsTrainSamSite(samSite.net.ID.Value)) return null;
            if (!_eventController.IsAggressive()) _eventController.MakeAggressive();
            return true;
        }
        private object OnTurretAuthorize(AutoTurret autoTurret, BasePlayer player) {
            if (player == null || autoTurret == null || autoTurret.net == null) return null;
            if (!_eventController.IsTrainTurret(autoTurret.net.ID.Value)) return null;
            if (!_eventController.IsAggressive()) _eventController.MakeAggressive();
            return true;
        }
        private object CanHackCrate(BasePlayer player, HackableLockedCrate crate) {
            if (player == null || crate == null || crate.net == null) return null;
            if (!_eventController.IsEventCrate(crate.net.ID.Value)) return null;
            if (!_eventController.IsAggressive()) {
                _eventController.MakeAggressive();
                return true;
            }
            if (!_eventController.IsPlayerCanLoot(player, true)) return true;
            if (!PveModeManager.IsPveModeBlockAction(player)) EconomyManager.AddBalance(player.userID, _config.SupportedPluginsConfig.EconomicsConfig.HackCratePoint);
            _eventController.OnPlayerStartHackingCrate((int)(HackableLockedCrate.requiredHackSeconds - crate.hackSeconds));
            return null;
        }
        private void OnLootEntity(BasePlayer player, StorageContainer storageContainer) {
            if (player == null || storageContainer == null || storageContainer.net == null) return;
            if (_ins._eventController.IsEventCrate(storageContainer.net.ID.Value)) _ins._eventController.OnEventCrateLooted(storageContainer, player.userID);
        }
        private void OnLootEntity(BasePlayer player, Fridge fridge) {
            if (player == null || fridge == null || fridge.net == null) return;
            if (_eventController.IsEventCrate(fridge.net.ID.Value)) _eventController.OnEventCrateLooted(fridge, player.userID);
        }
        private void OnLootEntityEnd(BasePlayer player, StorageContainer storageContainer) {
            if (storageContainer == null || storageContainer.net == null || !player.IsRealPlayer()) return;
            if (storageContainer is not LootContainer && _eventController.IsEventCrate(storageContainer.net.ID.Value)) if (storageContainer.inventory.IsEmpty()) storageContainer.Kill();
        }
        private void OnLootEntityEnd(BasePlayer player, Fridge fridge) {
            if (fridge == null || fridge.net == null || !player.IsRealPlayer()) return;
            if (_eventController.IsEventCrate(fridge.net.ID.Value)) if (fridge.inventory.IsEmpty()) fridge.Kill();
        }
#region OtherPlugins
        private object CanPveModeAllowDamage(SamSite samSite, HitInfo info) {
            if (_eventController == null || samSite == null || samSite.net == null || info == null) return null;
            if (!_eventController.IsTrainSamSite(samSite.net.ID.Value)) return null;
            if (!EventController.IsPlayerCanDealDamage(info.InitiatorPlayer, samSite, true)) return true;
            return null;
        }
        private object CanEntityBeTargeted(BasePlayer player, AutoTurret turret) {
            if (_eventController == null || turret == null || turret.net == null) return null;
            if (!_eventController.IsTrainTurret(turret.net.ID.Value)) return null;
            if (!player.IsRealPlayer()) return false;
            if (!_eventController.IsAggressive() && !_eventController.IsStopped()) return false;
            if (!_config.SupportedPluginsConfig.PveMode.Enable || !_eventController.IsStopped()) return true;
            return null;
        }
        private object CanEntityBeTargeted(PlayerHelicopter playerHelicopter, SamSite samSite) {
            if (_eventController == null || samSite == null || samSite.net == null) return null;
            if (!_eventController.IsTrainSamSite(samSite.net.ID.Value)) return null;
            return _eventController.IsAggressive();
        }
        private object CanEntityTakeDamage(AutoTurret autoTurret, HitInfo info) {
            if (_eventController == null || autoTurret == null || autoTurret.net == null || info == null) return null;
            if (!_eventController.IsTrainTurret(autoTurret.net.ID.Value)) return null;
            if (!info.InitiatorPlayer.IsRealPlayer()) return false;
            if (!EventController.IsPlayerCanDealDamage(info.InitiatorPlayer, autoTurret, true)) return false;
            return true;
        }
        private object CanEntityTakeDamage(SamSite samSite, HitInfo info) {
            if (_eventController == null || samSite == null || samSite.net == null || info == null) return null;
            if (!_eventController.IsTrainSamSite(samSite.net.ID.Value)) return null;
            if (!info.InitiatorPlayer.IsRealPlayer()) return false;
            if (!EventController.IsPlayerCanDealDamage(info.InitiatorPlayer, samSite, true)) return false;
            return true;
        }
        private object CanEntityTakeDamage(BasePlayer victim, HitInfo info) {
            if (_eventController == null || info == null || info.Initiator == null || info.Initiator.net == null || !victim.IsRealPlayer()) return null;
            if (_config.ZoneConfig.IsPvpZone && !_config.SupportedPluginsConfig.PveMode.Enable) {
                if (info.InitiatorPlayer.IsRealPlayer() && ZoneController.IsPlayerInZone(info.InitiatorPlayer.userID) && ZoneController.IsPlayerInZone(victim.userID)) return true;
            }
            if (!_config.SupportedPluginsConfig.PveMode.Enable && info.Initiator is AutoTurret && _eventController.IsTrainTurret(info.Initiator.net.ID.Value)) return true;
            return null;
        }
        private object CanEntityTakeDamage(PlayerHelicopter playerHelicopter, HitInfo info) {
            if (_eventController == null || info == null || info.Initiator == null || info.Initiator.net == null) return null;
            if (info.Initiator is SamSite) {
                if (_eventController.IsTrainSamSite(info.Initiator.net.ID.Value)) return true;
            }
            return null;
        }
        private object CanEntityTakeDamage(CustomBradley bradleyApc, HitInfo info) {
            if (_eventController == null || info == null || !info.InitiatorPlayer.IsRealPlayer() || bradleyApc.net == null) return null;
            if (_config.SupportedPluginsConfig.PveMode.Enable) return null;
            if (_eventController.IsTrainBradley(bradleyApc.net.ID.Value)) return true;
            return null;
        }
        private object OnCreateDynamicPVP(string eventName, PatrolHelicopter patrolHelicopter) {
            if (_eventController == null || patrolHelicopter == null || patrolHelicopter.net == null) return null;
            if (EventHeli.GetEventHeliByNetId(patrolHelicopter.net.ID.Value) != null) return true;
            return null;
        }
        private object OnCreateDynamicPVP(string eventName, BradleyAPC bradleyApc) {
            if (_eventController == null || bradleyApc == null || bradleyApc.net == null) return null;
            if (_eventController.IsTrainBradley(bradleyApc.net.ID.Value)) return true;
            return null;
        }
        private void SetOwnerPveMode(string eventName, BasePlayer player) {
            if (_eventController == null || string.IsNullOrEmpty(eventName) || eventName != Name || !player.IsRealPlayer()) return;
            if (eventName == Name) PveModeManager.OnNewOwnerSet(player);
        }
        private void ClearOwnerPveMode(string shortname) {
            if (_eventController == null || string.IsNullOrEmpty(shortname)) return;
            if (shortname == Name) PveModeManager.OnOwnerDeleted();
        }
        private object CanBradleySpawnNpc(BradleyAPC bradley) {
            if (_eventController == null || bradley == null || bradley.net == null) return null;
            if (_eventController.IsTrainBradley(bradley.net.ID.Value)) return true;
            return null;
        }
        private object CanHelicopterSpawnNpc(PatrolHelicopter patrolHelicopter) {
            if (_eventController == null || patrolHelicopter == null || patrolHelicopter.net == null) return null;
            if (_ins._config.SupportedPluginsConfig.BetterNpcConfig.IsHeliNpc) return null;
            if (EventHeli.GetEventHeliByNetId(patrolHelicopter.net.ID.Value) != null) return true;
            return null;
        }
#endregion OtherPlugins
#region Loot
        private void OnCorpsePopulate(ScientistNPC scientistNpc, NPCPlayerCorpse corpse) {
            if (scientistNpc == null || scientistNpc.net == null || corpse == null) return;
            EntityPresetInfo entityPresetInfo = scientistNpc.GetComponent<EntityPresetInfo>();
            if (entityPresetInfo == null) return;
            NpcConfig npcConfig = NpcSpawnManager.GetNpcConfigByPresetName(entityPresetInfo.presetName);
            if (npcConfig == null) return;
            LootController.UpdateNpcCorpse(corpse, npcConfig);
        }
        private void OnCrateSpawned(BradleyAPC bradleyApc, LockedByEntCrate crate) {
            if (bradleyApc == null || crate == null) return;
            EntityPresetInfo entityPresetInfo = bradleyApc.GetComponent<EntityPresetInfo>();
            if (entityPresetInfo == null) return;
            BradleyConfig bradleyConfig = _config.Bradleys.FirstOrDefault(x => x.PresetName == entityPresetInfo.presetName);
            if (bradleyConfig == null) return;
            if (bradleyConfig.InstCrateOpen) {
                crate.SetLockingEnt(null);
                crate.SetLocked(false);
            }
            _eventController.AddEventCrate(crate);
            LootController.UpdateHeliOrBradleyCrate(crate, bradleyConfig.LootTableConfig, bradleyConfig.PresetName);
        }
        private void OnCrateSpawned(PatrolHelicopter patrolHelicopter, LockedByEntCrate crate) {
            if (patrolHelicopter == null || crate == null) return;
            EntityPresetInfo entityPresetInfo = patrolHelicopter.GetComponent<EntityPresetInfo>();
            if (entityPresetInfo == null) return;
            HeliConfig heliConfig = _config.HeliConfigs.FirstOrDefault(x => x.PresetName == entityPresetInfo.presetName);
            if (heliConfig == null) return;
            if (heliConfig.InstCrateOpen) {
                crate.SetLockingEnt(null);
                crate.SetLocked(false);
            }
            _eventController.AddEventCrate(crate);
            LootController.UpdateHeliOrBradleyCrate(crate, heliConfig.LootTableConfig, heliConfig.PresetName);
        }
#region LootTablePlugin
        private object OnContainerPopulate(LootContainer lootContainer) {
            if (lootContainer == null) return null;
            LockedByEntCrate lockedByEntCrate = lootContainer as LockedByEntCrate;
            if (lockedByEntCrate != null) {
                LootTableConfig lootTableConfig = null;
                if (_eventHeli != null && Vector3.Distance(_eventHeli.transform.position, lockedByEntCrate.transform.position) < 15f) lootTableConfig = _eventHeli.HeliConfig.LootTableConfig;
                if (lootTableConfig == null) {
                    float minDistance = float.MaxValue;
                    BradleyAPC minDistanceBradley = null;
                    foreach (BradleyAPC bradleyApc in _eventController.Bradleys) {
                        if (bradleyApc == null) continue;
                        float distance = Vector3.Distance(bradleyApc.transform.position, lockedByEntCrate.transform.position);
                        if (distance < minDistance) {
                            minDistance = distance;
                            minDistanceBradley = bradleyApc;
                        }
                    }
                    if (minDistanceBradley != null && minDistance < 15) {
                        EntityPresetInfo bradleyPresetInfo = minDistanceBradley.GetComponent<EntityPresetInfo>();
                        if (bradleyPresetInfo == null) return null;
                        BradleyConfig bradleyConfig = _config.Bradleys.FirstOrDefault(x => x.PresetName == bradleyPresetInfo.presetName);
                        if (bradleyConfig == null) return null;
                        lootTableConfig = bradleyConfig.LootTableConfig;
                    }
                }
                if (lootTableConfig == null) return null;
                if (!lootTableConfig.IsLoottablePlugin) return true;
                return null;
            }
            EntityPresetInfo entityPresetInfo = lootContainer.GetComponent<EntityPresetInfo>();
            if (entityPresetInfo == null) return null;
            CrateConfig crateConfig = _config.CrateConfigs.FirstOrDefault(x => x.PresetName == entityPresetInfo.presetName);
            if (crateConfig == null) return null;
            if (!crateConfig.LootTableConfig.IsLoottablePlugin) return true;
            return null;
        }
        private object OnCorpsePopulate(NPCPlayerCorpse corpse) {
            if (corpse == null) return null;
            EntityPresetInfo entityPresetInfo = corpse.GetComponent<EntityPresetInfo>();
            if (entityPresetInfo == null) return null;
            NpcConfig npcConfig = _config.NpcConfigs.FirstOrDefault(x => x.PresetName == entityPresetInfo.presetName);
            if (npcConfig == null) return null;
            if (!npcConfig.LootTableConfig.IsLoottablePlugin) return true;
            return null;
        }
#endregion LootTablePlugin
#region AlphaLoot
        private object CanPopulateLoot(LootContainer lootContainer) {
            if (lootContainer == null) return null;
            EntityPresetInfo entityPresetInfo = lootContainer.GetComponent<EntityPresetInfo>();
            if (entityPresetInfo == null) return null;
            LockedByEntCrate lockedByEntCrate = lootContainer as LockedByEntCrate;
            if (lockedByEntCrate != null) {
                LootTableConfig lootTableConfig = null;
                BradleyConfig bradleyConfig = _config.Bradleys.FirstOrDefault(x => x.PresetName == entityPresetInfo.presetName);
                if (bradleyConfig != null) lootTableConfig = bradleyConfig.LootTableConfig;
                if (lootTableConfig == null) {
                    HeliConfig heliConfig = _config.HeliConfigs.FirstOrDefault(x => x.PresetName == entityPresetInfo.presetName);
                    if (heliConfig != null) lootTableConfig = heliConfig.LootTableConfig;
                }
                if (lootTableConfig == null) return null;
                if (!lootTableConfig.IsAlphaLoot) return true;
                return null;
            }
            CrateConfig crateConfig = _config.CrateConfigs.FirstOrDefault(x => x.PresetName == entityPresetInfo.presetName);
            if (crateConfig == null) return null;
            if (!crateConfig.LootTableConfig.IsAlphaLoot) return true;
            return null;
        }
        private object CanPopulateLoot(ScientistNPC scientistNpc, NPCPlayerCorpse corpse) {
            if (corpse == null) return null;
            EntityPresetInfo entityPresetInfo = corpse.GetComponent<EntityPresetInfo>();
            if (entityPresetInfo == null) return null;
            NpcConfig npcConfig = _config.NpcConfigs.FirstOrDefault(x => x.PresetName == entityPresetInfo.presetName);
            if (npcConfig == null) return null;
            if (!npcConfig.LootTableConfig.IsAlphaLoot) return true;
            return null;
        }
#endregion AlphaLoot
#region CustomLoot
        private object OnCustomLootContainer(NetworkableId net) {
            BaseEntity crateEntity = _eventController.GetCrateByNetId(net.Value);
            if (crateEntity == null) return null;
            EntityPresetInfo entityPresetInfo = crateEntity.GetComponent<EntityPresetInfo>();
            if (entityPresetInfo == null) return null;
            LockedByEntCrate lockedByEntCrate = crateEntity as LockedByEntCrate;
            if (lockedByEntCrate != null) {
                LootTableConfig lootTableConfig = null;
                BradleyConfig bradleyConfig = _config.Bradleys.FirstOrDefault(x => x.PresetName == entityPresetInfo.presetName);
                if (bradleyConfig != null) lootTableConfig = bradleyConfig.LootTableConfig;
                if (lootTableConfig == null) {
                    HeliConfig heliConfig = _config.HeliConfigs.FirstOrDefault(x => x.PresetName == entityPresetInfo.presetName);
                    if (heliConfig != null) lootTableConfig = heliConfig.LootTableConfig;
                }
                if (lootTableConfig == null) return null;
                if (!lootTableConfig.IsCustomLootPlugin) return true;
                return null;
            }
            CrateConfig crateConfig = _config.CrateConfigs.FirstOrDefault(x => x.PresetName == entityPresetInfo.presetName);
            if (crateConfig == null) return null;
            if (!crateConfig.LootTableConfig.IsCustomLootPlugin) return true;
            return null;
        }
        private object OnCustomLootNPC(NetworkableId net) {
            ScientistNPC scientistNpc = NpcSpawnManager.GetScientistByNetId(net.Value);
            if (scientistNpc == null) return null;
            EntityPresetInfo entityPresetInfo = scientistNpc.GetComponent<EntityPresetInfo>();
            if (entityPresetInfo == null) return null;
            NpcConfig npcConfig = _config.NpcConfigs.FirstOrDefault(x => x.PresetName == entityPresetInfo.presetName);
            if (npcConfig == null) return null;
            if (!npcConfig.LootTableConfig.IsCustomLootPlugin) return true;
            return null;
        }
#endregion CustomLoot
#endregion Loot
#endregion Hooks
#region Commands
        [ChatCommand("atrainstart")]
        private void ChatStartCommand(BasePlayer player, string command, string[] arg) {
            if (!player.IsAdmin) return;
            if (arg == null || arg.Length == 0) EventLauncher.DelayStartEvent(false, player);
            else {
                string eventPresetName = arg[0];
                EventLauncher.DelayStartEvent(false, player, eventPresetName);
            }
        }
        [ChatCommand("atrainstop")]
        private void ChatStopCommand(BasePlayer player, string command, string[] arg) {
            if (player.IsAdmin) EventLauncher.StopEvent();
        }
        [ConsoleCommand("atrainstart")]
        private void ConsoleStartCommand(ConsoleSystem.Arg arg) {
            if (arg.Player() != null) return;
            if (arg == null || arg.Args == null || arg.Args.Length == 0) EventLauncher.DelayStartEvent();
            else {
                string eventPresetName = arg.Args[0];
                EventLauncher.DelayStartEvent(presetName : eventPresetName);
            }
        }
        [ConsoleCommand("atrainstop")]
        private void ConsoleStopCommand(ConsoleSystem.Arg arg) {
            if (arg.Player() == null) EventLauncher.StopEvent();
        }
        [ChatCommand("atrainstartunderground")]
        private void ChatUndergroundStartCommand(BasePlayer player, string command, string[] arg) {
            if (!player.IsAdmin) return;
            if (arg == null || arg.Length == 0) EventLauncher.DelayStartEvent(false, player, overrideUndergroundChance : 100);
            else {
                string eventPresetName = arg[0];
                EventLauncher.DelayStartEvent(false, player, eventPresetName, 100);
            }
        }
        [ChatCommand("atrainstartaboveground")]
        private void ChatAboveGroundStartCommand(BasePlayer player, string command, string[] arg) {
            if (!player.IsAdmin) return;
            if (arg == null || arg.Length == 0) EventLauncher.DelayStartEvent(false, player, overrideUndergroundChance : 0);
            else {
                string eventPresetName = arg[0];
                EventLauncher.DelayStartEvent(false, player, eventPresetName, 0);
            }
        }
        [ConsoleCommand("atrainstartunderground")]
        private void ConsoleUndergroundStartCommand(ConsoleSystem.Arg arg) {
            if (arg.Player() != null) return;
            if (arg == null || arg.Args == null || arg.Args.Length == 0) EventLauncher.DelayStartEvent(overrideUndergroundChance : 100);
            else {
                string eventPresetName = arg.Args[0];
                EventLauncher.DelayStartEvent(presetName : eventPresetName, overrideUndergroundChance : 100);
            }
        }
        [ConsoleCommand("atrainstartaboveground")]
        private void ConsoleAboveGroundStartCommand(ConsoleSystem.Arg arg) {
            if (arg.Player() != null) return;
            if (arg == null || arg.Args == null || arg.Args.Length == 0) EventLauncher.DelayStartEvent(overrideUndergroundChance : 0);
            else {
                string eventPresetName = arg.Args[0];
                EventLauncher.DelayStartEvent(presetName : eventPresetName, overrideUndergroundChance : 0);
            }
        }
        [ChatCommand("atrainpoint")]
        private void ChatCustomPointCommand(BasePlayer player, string command, string[] arg) {
            if (!player.IsAdmin) return;
            if (!SpawnPositionFinder.IsRailsInPosition(player.transform.position)) {
                PrintToChat(player, _config.Prefix + " <color=#ce3f27>Couldn't</color> find the rails");
                return;
            }
            PrintToChat(player, _config.Prefix + " New spawn point <color=#738d43>successfully</color> added");
            Vector3 rotation = player.eyes.GetLookRotation().eulerAngles;
            LocationConfig locationConfig = new LocationConfig {
                Position = player.transform.position.ToString(), Rotation = (new Vector3(0, rotation.y, 0)).ToString()
            }
            ;
            _config.MainConfig.CustomSpawnPointConfig.Points.Add(locationConfig);
            SaveConfig();
        }
        [ConsoleCommand("savecustomwagon")]
        private void ConsoleSaveCustomWagonCommand(ConsoleSystem.Arg arg) {
            if (arg.Player() != null) return;
            string customizationPresetName = arg.Args[0];
            string wagonShortPrefabName = arg.Args[1];
            WagonCustomizer.MapSaver.CreateOrAddNewWagonToData(customizationPresetName, wagonShortPrefabName);
        }
#endregion Commands
#region Methods
        private void Unsubscribes() {
            foreach (string hook in _subscribeMethods) Unsubscribe(hook);
        }
        private void Subscribes() {
            foreach (string hook in _subscribeMethods) Subscribe(hook);
        }
        private static void Debug(params object[] arg) {
            string result = "";
            foreach (object obj in arg) if (obj != null) result += obj.ToString() + " ";
            _ins.Puts(result);
        }
#endregion Methods
#region Classes
        private static class EventLauncher {
            private static Coroutine _autoEventCoroutine;
            private static Coroutine _delayedEventStartCoroutine;
            public static bool IsEventActive() {
                return _ins != null && _ins._eventController != null;
            }
            public static void AutoStartEvent() {
                if (!_ins._config.MainConfig.IsAutoEvent) return;
                if (_autoEventCoroutine != null) ServerMgr.Instance.StopCoroutine(_autoEventCoroutine);
                _autoEventCoroutine = ServerMgr.Instance.StartCoroutine(AutoEventCoroutine());
            }
            public static void DelayStartEvent(bool isAutoActivated = false, BasePlayer activator = null, string presetName = "", float overrideUndergroundChance = -1) {
                if (IsEventActive() || _delayedEventStartCoroutine != null) {
                    NotifyManager.PrintError(activator, "EventActive_Exeption");
                    return;
                }
                if (_autoEventCoroutine != null) ServerMgr.Instance.StopCoroutine(_autoEventCoroutine);
                float undergroundChance = overrideUndergroundChance >= 0 ? overrideUndergroundChance : _ins._config.MainConfig.UndergroundChance;
                bool isUnderGround = Random.Range(0f, 100f) < undergroundChance;
                EventConfig eventConfig = DefineEventConfig(presetName, isUnderGround);
                if (eventConfig == null) {
                    NotifyManager.PrintError(activator, "ConfigurationNotFound_Exeption");
                    StopEvent();
                    return;
                }
                _delayedEventStartCoroutine = ServerMgr.Instance.StartCoroutine(DelayedStartEventCoroutine(eventConfig, isUnderGround));
                if (!isAutoActivated) NotifyManager.PrintInfoMessage(activator, "SuccessfullyLaunched");
            }
            private static IEnumerator AutoEventCoroutine() {
                yield return CoroutineEx.waitForSeconds(Random.Range(_ins._config.MainConfig.MinTimeBetweenEvents, _ins._config.MainConfig.MaxTimeBetweenEvents));
                yield return CoroutineEx.waitForSeconds(5f);
                DelayStartEvent(true);
            }
            private static IEnumerator DelayedStartEventCoroutine(EventConfig eventConfig, bool isUnderGround) {
                if (_ins._config.NotifyConfig.PreStartTime > 0) NotifyManager.SendMessageToAll("PreStartTrain", _ins._config.Prefix, eventConfig.DisplayName, _ins._config.NotifyConfig.PreStartTime);
                yield return CoroutineEx.waitForSeconds(_ins._config.NotifyConfig.PreStartTime);
                StartEvent(eventConfig, isUnderGround);
            }
            private static void StartEvent(EventConfig eventConfig, bool isUnderGround) {
                GameObject gameObject = new GameObject();
                _ins._eventController = gameObject.AddComponent<EventController>();
                _ins._eventController.Init(eventConfig, isUnderGround);
                if (_ins._config.MainConfig.EnableStartStopLogs) NotifyManager.PrintLogMessage("EventStart_Log", eventConfig.PresetName);
                Interface.CallHook($"On{_ins.Name}EventStart");
            }
            public static void StopEvent(bool isPluginUnloadingOrFailed = false) {
                if (IsEventActive()) {
                    _ins.Unsubscribes();
                    _ins._eventController.DeleteController();
                    ZoneController.TryDeleteZone();
                    PveModeManager.OnEventEnd();
                    EventMapMarker.DeleteMapMarker();
                    NpcSpawnManager.ClearData(false);
                    GuiManager.DestroyAllGui();
                    EconomyManager.OnEventEnd();
                    EventHeli.ClearData();
                    NotifyManager.SendMessageToAll("EndEvent", _ins._config.Prefix);
                    Interface.CallHook($"On{_ins.Name}EventStop");
                    if (_ins._config.MainConfig.EnableStartStopLogs) NotifyManager.PrintLogMessage("EventStop_Log");
                    if (!isPluginUnloadingOrFailed) AutoStartEvent();
                }
                if (_delayedEventStartCoroutine != null) {
                    ServerMgr.Instance.StopCoroutine(_delayedEventStartCoroutine);
                    _delayedEventStartCoroutine = null;
                }
            }
            private static EventConfig DefineEventConfig(string eventPresetName, bool isUnderGround) {
                if (eventPresetName != "") return _ins._config.EventConfigs.FirstOrDefault(x => x.PresetName == eventPresetName);
                HashSet<EventConfig> suitableEventConfigs = _ins._config.EventConfigs.Where(x => x.Chance > 0 && x.IsAutoStart && (!isUnderGround || x.IsUndergroundTrain) && IsEventConfigSuitableByTime(x));
                if (suitableEventConfigs == null || suitableEventConfigs.Count == 0) return null;
                float sumChance = 0;
                foreach (EventConfig eventConfig in suitableEventConfigs) sumChance += eventConfig.Chance;
                float random = Random.Range(0, sumChance);
                foreach (EventConfig eventConfig in suitableEventConfigs) {
                    random -= eventConfig.Chance;
                    if (random <= 0) return eventConfig;
                }
                return null;
            }
            private static bool IsEventConfigSuitableByTime(EventConfig eventConfig) {
                if (eventCo
// ... [Code preview truncated due to length. Full source in attached file] ...

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