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

FREE ArmoredTrain : 1.8.0 1.8.0

Нет прав для скачивания
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 CompanionServer.Handlers;
using Time = UnityEngine.Time;
using static TrainEngine;
using static ProtoBuf.PatternFirework;
using static BaseCombatEntity;
namespace Oxide.Plugins {
    [Info("ArmoredTrain", "Adem", "1.8.0")]
    class ArmoredTrain : RustPlugin {
#region Variables
        const bool en = false;
        static ArmoredTrain ins;
        EventController eventController;
        [PluginReference]
        Plugin NpcSpawn, PveMode, GUIAnnouncements, Notify, DiscordMessages, DynamicPVP, Economics, ServerRewards, IQEconomic, TrainHomes, AlphaLoot;
        HashSet<string> subscribeMethods = new HashSet<string> {
            "OnEntitySpawned", "OnEntityTakeDamage", "OnEntityDeath", "OnEntityEnter", "CanHelicopterTarget", "CanBradleyApcTarget", "OnTrainCarUncouple", "CanTrainCarCouple", "CanPickupEntity", "CanMountEntity", "OnSwitchToggle", "OnSwitchToggled", "OnCounterModeToggle", "OnCounterTargetChange", "CanLootEntity", "OnSamSiteModeToggle", "OnTurretAuthorize", "CanHackCrate", "OnLootEntity", "OnLootEntityEnd", "OnCorpsePopulate", "OnCustomNpcTarget", "CanEntityBeTargeted", "CanEntityTakeDamage", "CanPopulateLoot", "OnCustomLootContainer", "OnCustomLootNPC", "OnCreateDynamicPVP", "SetOwnerPveMode", "ClearOwnerPveMode", "CanBradleySpawnNpc", "CanHelicopterSpawnNpc"
        }
        ;
#endregion Variables
#region ExternalAPI
        bool IsArmoredTrainActive() {
            return EventLauncher.IsEventActive();
        }
        bool StopArmoredTrain() {
            if (!EventLauncher.IsEventActive()) return false;
            //eventController.StopMoving(13954);
            return true;
        }
        bool StartArmoredTrainEvent() {
            if (EventLauncher.IsEventActive()) return false;
            EventLauncher.DelayStartEvent();
            return true;
        }
        bool EndArmoredTrainEvent() {
            if (EventLauncher.IsEventActive()) return false;
            EventLauncher.StopEvent();
            return true;
        }
        Vector3 ArmoredTrainLocomotivePosition() {
            if (!EventLauncher.IsEventActive()) return Vector3.zero;
            return eventController.GetEventPosition();
        }
        bool IsTrainBradley(ulong netID) {
            return EventLauncher.IsEventActive() && eventController.IsTrainBradley(netID);
        }
        bool IsTrainHeli(ulong netID) {
            if (!EventLauncher.IsEventActive()) return false;
            return EventHeli.GetEventHeliByNetId(netID) != null;
        }
        bool IsTrainCrate(ulong netID) {
            return EventLauncher.IsEventActive() && LootManager.GetContainerDataByNetId(netID) != null;
        }
        bool IsTrainSamSite(ulong netID) {
            return EventLauncher.IsEventActive() && eventController.IsTrainSamSite(netID);
        }
        bool IsTrainWagon(ulong netID) {
            return EventLauncher.IsEventActive() && eventController.IsTrainWagon(netID);
        }
        bool IsTrainTurret(ulong netID) {
            return EventLauncher.IsEventActive() && eventController.IsTrainTurret(netID);
        }
#endregion ExternalAPI
#region Hooks
        void Init() {
            Unsubscribes();
        }
        void OnServerInitialized() {
            ins = this;
            if (!NpcSpawnManager.IsNpcSpawnReady()) return;
            LoadDefaultMessages();
            UpdateConfig();
            UpdateLootTables();
            GuiManager.LoadImages();
            WagonCustomizator.LoadCurrentCustomizationProfile();
            LootManager.InitialLootManagerUpdate();
            EventLauncher.AutoStartEvent();
        }
        void Unload() {
            EventLauncher.StopEvent(true);
            ins = null;
        }
        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();
        }
        void OnEntitySpawned(LockedByEntCrate entity) {
            if (!entity.IsExists()) return;
            if (entity.ShortPrefabName == "heli_crate") LootManager.OnHeliCrateSpawned(entity);
        }
        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;
        }
        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;
            else {
                eventHeli.OnHeliAttacked(info.InitiatorPlayer.userID);
                eventController.OnTrainAttacked(info.InitiatorPlayer);
            }
            return null;
        }
        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;
            else eventController.OnTrainAttacked(info.InitiatorPlayer);
            return null;
        }
        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;
            else if (!eventController.IsPlayerCanDealDamage(info.InitiatorPlayer, autoTurret, true)) return true;
            else eventController.OnTrainAttacked(info.InitiatorPlayer);
            return null;
        }
        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;
            else if (!eventController.IsPlayerCanDealDamage(info.InitiatorPlayer, samSite, true)) return true;
            else eventController.OnTrainAttacked(info.InitiatorPlayer);
            return null;
        }
        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;
        }
        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;
        }
        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;
                }
                else {
                    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);
                }
                return null;
            }
            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;
        }
        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);
        }
        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);
        }
        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);
        }
        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);
            }
        }
        object OnEntityEnter(TriggerTrainCollisions trigger, TrainCar trainCar) {
            if (!ins._config.mainConfig.destrroyWagons || 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)) {
                if (trainCar is TrainEngine) {
                    if (eventController.IsReverse()) return null;
                }
                else if (!eventController.IsReverse()) {
                    return null;
                }
                if (trigger.owner.IsExists() && ins._config.mainConfig.destrroyWagons) {
                    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;
        }
        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;
        }
        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.IsAgressive()) return false;
            if (player.IsSleeping() || (player.InSafeZone() && !player.IsHostile())) return false;
            return null;
        }
        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;
        }
        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;
        }
        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;
        }
        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;
        }
        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;
        }
        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;
        }
        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;
        }
        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);
        }
        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;
        }
        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;
        }
        void OnPlayerSleep(BasePlayer player) {
            if (player == null) return;
            ZoneController.OnPlayerLeaveZone(player);
        }
        object CanLootEntity(BasePlayer player, LootContainer container) {
            if (player == null || container == null || container.net == null) return null;
            if (LootManager.GetContainerDataByNetId(container.net.ID.Value) == null) return null;
            if (!eventController.IsAgressive()) {
                eventController.MakeAgressive();
                return true;
            }
            if (!eventController.IsPlayerCanLoot(player, true)) return true;
            return null;
        }
        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.IsAgressive()) eventController.MakeAgressive();
            return true;
        }
        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.IsAgressive()) eventController.MakeAgressive();
            return true;
        }
        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.IsAgressive()) eventController.MakeAgressive();
            return true;
        }
        object CanHackCrate(BasePlayer player, HackableLockedCrate crate) {
            if (player == null || crate == null || crate.net == null) return null;
            StorageContainerData storageContainerData = LootManager.GetContainerDataByNetId(crate.net.ID.Value);
            if (storageContainerData == null) return null;
            if (!eventController.IsAgressive()) {
                eventController.MakeAgressive();
                return true;
            }
            if (!eventController.IsPlayerCanLoot(player, true)) return true;
            if (!PveModeManager.IsPveModeBlockAction(player)) EconomyManager.AddBalance(player.userID, _config.supportedPluginsConfig.economicsConfig.hackCratePoint);
            CrateConfig crateConfig = LootManager.GetCrateConfigByPresetName(storageContainerData.presetName);
            crate.Invoke(() => LootManager.UpdateCrateHackTime(crate, storageContainerData.presetName), 1.1f);
            eventController.OnPlayerStartHackingCrate((int)crateConfig.hackTime);
            return null;
        }
        void OnLootEntity(BasePlayer player, StorageContainer storageContainer) {
            if (player == null || storageContainer == null || storageContainer.net == null) return;
            StorageContainerData storageContainerData = LootManager.GetContainerDataByNetId(storageContainer.net.ID.Value);
            if (storageContainerData == null) return;
            LootManager.OnEventCrateLooted(storageContainer, player.userID);
        }
        void OnLootEntityEnd(BasePlayer player, StorageContainer storageContainer) {
            if (storageContainer == null || storageContainer.net == null || !player.IsRealPlayer()) return;
            if (LootManager.GetContainerDataByNetId(storageContainer.net.ID.Value) == null) return;
            if (storageContainer is LootContainer == false) {
                if (storageContainer.inventory.IsEmpty()) storageContainer.Kill();
            }
            eventController.EventPassingCheck();
        }
        void OnCorpsePopulate(ScientistNPC scientistNPC, NPCPlayerCorpse corpse) {
            if (scientistNPC == null || scientistNPC.net == null || corpse == null) return;
            if (NpcSpawnManager.GetScientistByNetId(scientistNPC.net.ID.Value) == null) return;
            NpcConfig npcConfig = NpcSpawnManager.GetNpcConfigByDisplayName(scientistNPC.displayName);
            if (npcConfig != null) {
                ins.NextTick(() => {
                    if (corpse == null) return;
                    if (!corpse.containers.IsNullOrEmpty() && corpse.containers[0] != null) LootManager.UpdateItemContainer(corpse.containers[0], npcConfig.lootTableConfig, npcConfig.lootTableConfig.clearDefaultItemList);
                    if (npcConfig.deleteCorpse && !corpse.IsDestroyed) corpse.Kill();
                }
                );
            }
        }
#region OtherPlugins
        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;
            else if (!eventController.IsAgressive()) return false;
            else if (!PveModeManager.IsPveModeBlockAction(player)) return true;
            return null;
        }
        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;
            if (!eventController.IsAgressive()) return false;
            return true;
        }
        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;
            else if (!eventController.IsPlayerCanDealDamage(info.InitiatorPlayer, autoTurret, true)) return false;
            else if (!_config.supportedPluginsConfig.pveMode.enable || _config.supportedPluginsConfig.pveMode.damageTurret || !PveModeManager.IsPveModeBlockAction(info.InitiatorPlayer)) return true;
            return null;
        }
        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;
            else if (!eventController.IsPlayerCanDealDamage(info.InitiatorPlayer, samSite, true)) return false;
            else if (!_config.supportedPluginsConfig.pveMode.enable || _config.supportedPluginsConfig.pveMode.damageTurret || !PveModeManager.IsPveModeBlockAction(info.InitiatorPlayer)) return true;
            return null;
        }
        object CanEntityTakeDamage(BasePlayer victim, HitInfo hitinfo) {
            if (eventController == null || hitinfo == null || hitinfo.Initiator == null || hitinfo.Initiator.net == null || !victim.IsRealPlayer()) return null;
            if (_config.zoneConfig.isPVPZone && !_config.supportedPluginsConfig.pveMode.enable) {
                if (hitinfo.InitiatorPlayer.IsRealPlayer() && ZoneController.IsPlayerInZone(hitinfo.InitiatorPlayer.userID) && ZoneController.IsPlayerInZone(victim.userID)) return true;
            }
            if (hitinfo.Initiator is AutoTurret) {
                if (eventController.IsTrainTurret(hitinfo.Initiator.net.ID.Value)) return true;
            }
            return null;
        }
        object CanEntityTakeDamage(PlayerHelicopter playerHelicopter, HitInfo hitinfo) {
            if (eventController == null || hitinfo == null || hitinfo.Initiator == null || hitinfo.Initiator.net == null) return null;
            if (hitinfo.Initiator is SamSite) {
                if (eventController.IsTrainSamSite(hitinfo.Initiator.net.ID.Value)) return true;
            }
            return null;
        }
        object CanEntityTakeDamage(CustomBradley bradleyApc, HitInfo hitinfo) {
            if (eventController == null || hitinfo == null || !hitinfo.InitiatorPlayer.IsRealPlayer() || bradleyApc.net == null) return null;
            if (eventController.IsTrainBradley(bradleyApc.net.ID.Value)) return true;
            return null;
        }
        object CanPopulateLoot(LootContainer lootContainer) {
            if (eventController == null || lootContainer == null || lootContainer.net == null) return null;
            StorageContainerData storageContainerData = LootManager.GetContainerDataByNetId(lootContainer.net.ID.Value);
            if (storageContainerData != null) {
                CrateConfig crateConfig = LootManager.GetCrateConfigByPresetName(storageContainerData.presetName);
                if (crateConfig != null && !crateConfig.lootTableConfig.isAlphaLoot) return true;
            }
            return null;
        }
        object CanPopulateLoot(ScientistNPC scientistNPC, NPCPlayerCorpse corpse) {
            if (eventController == null || scientistNPC == null || scientistNPC.net == null) return null;
            NpcConfig npcConfig = NpcSpawnManager.GetNpcConfigByDisplayName(scientistNPC.displayName);
            if (npcConfig != null && !npcConfig.lootTableConfig.isAlphaLoot) return true;
            return null;
        }
        object OnCustomLootContainer(NetworkableId netID) {
            if (eventController == null || netID == null) return null;
            StorageContainerData storageContainerData = LootManager.GetContainerDataByNetId(netID.Value);
            if (storageContainerData != null) {
                CrateConfig crateConfig = LootManager.GetCrateConfigByPresetName(storageContainerData.presetName);
                if (crateConfig != null && !crateConfig.lootTableConfig.isCustomLoot) return true;
            }
            return null;
        }
        object OnCustomLootNPC(NetworkableId netID) {
            if (eventController == null || netID == null) return null;
            ScientistNPC scientistNPC = NpcSpawnManager.GetScientistByNetId(netID.Value);
            if (scientistNPC != null) {
                NpcConfig npcConfig = NpcSpawnManager.GetNpcConfigByDisplayName(scientistNPC.displayName);
                if (npcConfig != null && !npcConfig.lootTableConfig.isCustomLoot) return true;
            }
            return null;
        }
        object OnContainerPopulate(LootContainer lootContainer) {
            if (eventController == null || lootContainer == null || lootContainer.net == null) return null;
            StorageContainerData storageContainerData = LootManager.GetContainerDataByNetId(lootContainer.net.ID.Value);
            if (storageContainerData != null) {
                CrateConfig crateConfig = LootManager.GetCrateConfigByPresetName(storageContainerData.presetName);
                if (crateConfig != null && !crateConfig.lootTableConfig.isLootTablePLugin) return true;
            }
            return null;
        }
        object OnCorpsePopulate(NPCPlayerCorpse corpse) {
            if (eventController == null || corpse == null) return null;
            NpcConfig npcConfig = NpcSpawnManager.GetNpcConfigByDisplayName(corpse.playerName);
            if (npcConfig != null && !npcConfig.lootTableConfig.isAlphaLoot) return true;
            return null;
        }
        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;
        }
        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;
        }
        void SetOwnerPveMode(string eventName, BasePlayer player) {
            if (eventController == null || string.IsNullOrEmpty(eventName) || eventName != Name || !player.IsRealPlayer()) return;
            if (eventName == Name) PveModeManager.OnNewOwnerSet(player);
        }
        void ClearOwnerPveMode(string shortname) {
            if (eventController == null || string.IsNullOrEmpty(shortname)) return;
            if (shortname == Name) PveModeManager.OnOwnerDeleted();
        }
        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;
        }
        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
#endregion Hooks
#region Commands
        [ChatCommand("atrainstart")]
        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")]
        void ChatStopCommand(BasePlayer player, string command, string[] arg) {
            if (player.IsAdmin) EventLauncher.StopEvent();
        }
        [ConsoleCommand("atrainstart")]
        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")]
        void ConsoleStopCommand(ConsoleSystem.Arg arg) {
            if (arg.Player() == null) EventLauncher.StopEvent();
        }
        [ChatCommand("atrainstartunderground")]
        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")]
        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")]
        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")]
        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")]
        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")]
        void ConsoleSaveCustomWagonCommand(ConsoleSystem.Arg arg) {
            if (arg.Player() != null) return;
            string customizationPresetName = arg.Args[0];
            string wagonShortPrefabName = arg.Args[1];
            WagonCustomizator.MapSaver.CreateOrAddNewWagonToData(customizationPresetName, wagonShortPrefabName);
        }
#endregion Commands
#region Methods
        void Unsubscribes() {
            foreach (string hook in subscribeMethods) Unsubscribe(hook);
        }
        void Subscribes() {
            foreach (string hook in subscribeMethods) Subscribe(hook);
        }
        void UpdateConfig() {
            if (_config.versionConfig != Version) {
                PluginConfig defaultConfig = PluginConfig.DefaultConfig();
                if (_config.versionConfig.Minor == 4) {
                    if (_config.versionConfig.Patch <= 1) {
                        CrateConfig crateNormalConfig = new CrateConfig {
                            presetName = "crate_normal_default", prefab = "assets/bundled/prefabs/radtown/crate_normal.prefab", hackTime = 0, lootTableConfig = new LootTableConfig {
                                minItemsAmount = 1, maxItemsAmount = 2, items = new List<LootItemConfig> {
                                    new LootItemConfig {
                                        shortname = "scrap", minAmount = 100, maxAmount = 200, chance = 100f, isBlueprint = false, skin = 0, name = ""
                                    }
                                }
                            }
                        }
                        ;
                        CrateConfig crateNormal2Config = new CrateConfig {
                            presetName = "crate_normal2_default", prefab = "assets/bundled/prefabs/radtown/crate_normal_2.prefab", hackTime = 0, lootTableConfig = new LootTableConfig {
                                minItemsAmount = 1, maxItemsAmount = 2, items = new List<LootItemConfig> {
                                    new LootItemConfig {
                                        shortname = "scrap", minAmount = 100, maxAmount = 200, chance = 100f, isBlueprint = false, skin = 0, name = ""
                                    }
                                }
                            }
                        }
                        ;
                        _config.crateConfigs.Add(crateNormalConfig);
                        _config.crateConfigs.Add(crateNormal2Config);
                        TurretConfig turretConfig = _config.turretConfigs.FirstOrDefault(x => true);
                        WagonConfig halloweenWagoConfig = new WagonConfig {
                            presetName = "halloween_wagon", prefabName = "assets/content/vehicles/trains/wagons/trainwagonunloadableloot.entity.prefab", brradleys = new Dictionary<string, HashSet<LocationConfig>>(), crates = new Dictionary<string, HashSet<LocationConfig>> {
                                ["crate_normal_default"]
                                = new HashSet<LocationConfig> {
                                    new LocationConfig {
                                        position = "(0.407, 2.403, -3.401)", rotation = "(303.510, 0, 328.794)"
                                    }
                                    , new LocationConfig {
                                        position = "(-0.374, 2.416, 3.104)", rotation = "(21.106, 261.772, 352.540)"
                                    }
                                }
                                , ["crate_normal2_default"] = new HashSet<LocationConfig> {
                                    new LocationConfig {
                                        position = "(-0.095, 1.817, -0.217)", rotation = "(19.048, 336.704, 359.624)"
                                    }
                                }
                            }
                            , samsites = new Dictionary<string, HashSet<LocationConfig>>(), decors = new Dictionary<string, HashSet<LocationConfig>>(), npcs = new Dictionary<string, HashSet<LocationConfig>>(), turrets = new Dictionary<string, HashSet<LocationConfig>> {
                                [turretConfig.presetName]
                                = new HashSet<LocationConfig> {
                                    new LocationConfig {
                                        position = "(-0.940, 1.559, -6.811)", rotation = "(0, 180, 0)"
                                    }
                                    , new LocationConfig {
                                        position = "(0.940, 1.559, -6.811)", rotation = "(0, 180, 0)"
                                    }
                                    , new LocationConfig {
                                        position = "(-0.940, 1.559, 6.811)", rotation = "(0, 0, 0)"
                                    }
                                    , new LocationConfig {
                                        position = "(0.940, 1.559, 6.811)", rotation = "(0, 0, 0)"
                                    }
                                }
                            }
                            ,
                        }
                        ;
                        _config.wagonConfigs.Add(halloweenWagoConfig);
                        NpcConfig npcConfig = _config.npcConfigs.FirstOrDefault(x => true);
                        LocomotiveConfig halloweenLocomotive = new LocomotiveConfig {
                            presetName = "locomotive_halloween", prefabName = "assets/content/vehicles/trains/locomotive/locomotive.entity.prefab", engineForce = 500000f, maxSpeed = 14, brradleys = new Dictionary<string, HashSet<LocationConfig>> {
                            }
                            , turrets = new Dictionary<string, HashSet<LocationConfig>> {
                            }
                            , npcs = new Dictionary<string, HashSet<LocationConfig>> {
                                [npcConfig.displayName]
                                = new HashSet<LocationConfig> {
                                    new LocationConfig {
                                        position = "(-1.341, 1.546, 2)", rotation = "(0, 0, 0)"
                                    }
                                    , new LocationConfig {
                                        position = "(-1.341, 1.546, -2)", rotation = "(0, 0, 0)"
                                    }
                                    , new LocationConfig {
                                        position = "(-1.341, 1.546, -6)", rotation = "(0, 0, 0)"
                                    }
                                    , new LocationConfig {
                                        position = "(1.341, 1.546, 2)", rotation = "(0, 0, 0)"
                                    }
                                    , new LocationConfig {
                                        position = "(1.341, 1.546, -2)", rotation = "(0, 0, 0)"
                                    }
                                    , new LocationConfig {
                                        position = "(1.341, 1.546, -6)", rotation = "(0, 0, 0)"
                                    }
                                }
                            }
                            , crates = new Dictionary<string, HashSet<LocationConfig>> {
                            }
                            , samsites = new Dictionary<string, HashSet<LocationConfig>> {
                            }
                            , decors = new Dictionary<string, HashSet<LocationConfig>> {
                            }
                        }
                        ;
                        _config.locomotiveConfigs.Add(halloweenLocomotive);
                        WagonConfig samsiteWagomConfig = _config.wagonConfigs.FirstOrDefault(x => x.presetName.Contains("sam"));
                        WagonConfig crateWagomConfig = _config.wagonConfigs.FirstOrDefault(x => x.presetName.Contains("crate"));
                        EventConfig halloweenTrainConfig = new EventConfig {
                            presetName = "train_halloween", displayName = en ? "Halloween Train" : "Хэллоуинский Поезд", isUndergroundTrain = false, eventTime = 3600, stopTime = 300, isAutoStart = true, chance = 0, locomotivePreset = "locomotive_halloween", wagonsPreset = new List<string>(), heliPreset = ""
                        }
                        ;
                        if (crateWagomConfig != null) halloweenTrainConfig.wagonsPreset.Add(crateWagomConfig.presetName);
                        halloweenTrainConfig.wagonsPreset.Add(halloweenWagoConfig.presetName);
                        if (samsiteWagomConfig != null) halloweenTrainConfig.wagonsPreset.Add(samsiteWagomConfig.presetName);
                        _config.eventConfigs.Add(halloweenTrainConfig);
                    }
                    if (_config.versionConfig.Patch <= 3) {
                        _config.customizationConfig = new CustomizationConfig {
                            isElectricFurnacesEnable = true, isBoilersEnable = true, isFireEnable = true
                        }
                        ;
                    }
                    if (_config.versionConfig.Patch <= 4) {
                        if (_config.customizationConfig == null) {
                            _config.customizationConfig = new CustomizationConfig {
                                isElectricFurnacesEnable = true, isBoilersEnable = true, isFireEnable = true
                            }
                            ;
                        }
                    }
                    if (_config.versionConfig.Patch <= 6) {
                        _config.customizationConfig.isLightOnlyAtNight = true;
                        _config.mainConfig.isRestoreStopTimeAfterDamageOrLoot = true;
                    }
                    if (_config.versionConfig.Patch <= 7) {
                        _config.customizationConfig.profileName = "";
                        _config.eventConfigs.Add (new EventConfig {
                            presetName = "train_xmas_easy", displayName = en ? "Small Christmas train" : "Маленький Новогодний Поезд", isUndergroundTrain = true, eventTime = 3600, stopTime = 300, isAutoStart = true, chance = 0, locomotivePreset = "locomotive_default", wagonsPreset = new List<string> {
                                "xmas_wagon_1"
                            }
                            , heliPreset = ""
                        }
                        );
                        _config.eventConfigs.Add (new EventConfig {
                            presetName = "train_xmas_medium", displayName = en ? "Medium Christmas train" : "Средний Новогодний Поезд", isUndergroundTrain = true, eventTime = 3600, stopTime = 300, isAutoStart = true, chance = 0, locomotivePreset = "locomotive_turret", wagonsPreset = new List<string> {
                                "xmas_wagon_1", "xmas_wagon_2"
                            }
                            , heliPreset = ""
                        }
                        );
                        _config.eventConfigs.Add (new EventConfig {
                            presetName = "train_xmas_hard", displayName = en ? "Big Christmas train" : "Большой Новогодний Поезд", isUndergroundTrain = false, eventTime = 3600, stopTime = 300, isAutoStart = true, chance = 0, locomotivePreset = "locomotive_new", wagonsPreset = new List<string> {
                                "wagon_crate_2", "xmas_wagon_2", "wagon_bradley"
                            }
                            , heliPreset = ""
                        }
                        );
                        _config.wagonConfigs.Add (new WagonConfig {
                            presetName = "xmas_wagon_1", prefabName = "assets/content/vehicles/trains/wagons/trainwagonunloadableloot.entity.prefab", brradleys = new Dictionary<string, HashSet<LocationConfig>>(), crates = new Dictionary<string, HashSet<LocationConfig>> {
                                ["xmas_crate"]
                                = new HashSet<LocationConfig> {
                                    new LocationConfig {
                                        position = "(-0.148, 2.707, -1.613)", rotation = "(72.214, 0, 0)"
                                    }
                
// ... [Code preview truncated due to length. Full source in attached file] ...

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