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

FREE Convoy : 2.7.3 2.7.3

Нет прав для скачивания
C#:
using CompanionServer.Handlers;
using Epic.OnlineServices.Presence;
using Facepunch;
using Network;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using Oxide.Core;
using Oxide.Core.Plugins;
using Oxide.Game.Rust.Cui;
using Oxide.Plugins.ConvoyExtensionMethods;
using Rust;
using Rust.Modular;
using System;
using System.Collections;
using System.Collections.Generic;
using System.IO;
using System.Reflection;
using UnityEngine;
using UnityEngine.AI;
using static BaseVehicle;
using Time = UnityEngine.Time;
namespace Oxide.Plugins {
    [Info("Convoy", "Adem", "2.7.3")]
    class Convoy : RustPlugin {
#region Variables
        const bool en = false;
        static Convoy ins;
        EventController eventController;
        [PluginReference]
        Plugin ArmoredTrain, NpcSpawn, GUIAnnouncements, DiscordMessages, Notify, PveMode, Economics, ServerRewards, IQEconomic, DynamicPVP, AlphaLoot;
        HashSet<string> subscribeMetods = new HashSet<string> {
            "OnEntitySpawned", "OnExplosiveThrown", "CanExplosiveStick", "CanMountEntity", "CanDismountEntity", "OnPlayerSleep", "CanPickupEntity", "OnEntityTakeDamage", "OnEntityDeath", "OnEntityKill", "CanHelicopterTarget", "OnCustomNpcTarget", "CanBradleyApcTarget", "OnCorpsePopulate", "CanHackCrate", "CanLootEntity", "OnLootEntity", "OnLootEntityEnd", "OnEntityEnter", "CanEntityBeTargeted", "CanEntityTakeDamage", "CanBradleySpawnNpc", "CanHelicopterSpawnNpc", "OnCreateDynamicPVP", "CanPopulateLoot", "OnCustomLootContainer", "OnCustomLootNPC", "OnContainerPopulate", "OnCorpsePopulate", "SetOwnerPveMode", "ClearOwnerPveMode", "OnEngineLoadoutOverride", "OnSetupTurret"
        }
        ;
#endregion Variables
#region API
        private bool IsConvoyVehicle(BaseEntity entity) {
            if (eventController == null || entity == null || entity.net == null) return false;
            return ConvoyPathVehicle.GetVehicleByNetId(entity.net.ID.Value) != null;
        }
        private bool IsConvoyCrate(BaseEntity crate) {
            if (eventController == null || crate == null || crate.net == null) return false;
            return LootManager.GetContainerDataByNetId(crate.net.ID.Value) != null;
        }
        private bool IsConvoyHeli(PatrolHelicopter patrolHelicopter) {
            if (eventController == null || patrolHelicopter == null || patrolHelicopter.net == null) return false;
            return EventHeli.GetEventHeliByNetId(patrolHelicopter.net.ID.Value) != null;
        }
#endregion API
#region Hooks
        void Init() {
            Unsubscribes();
        }
        void OnServerInitialized() {
            ins = this;
            if (!NpcSpawnManager.IsNpcSpawnReady()) return;
            LoadDefaultMessages();
            LoadData();
            GuiManager.LoadImages();
            PathManager.StartCachingRouts();
            LootManager.InitialLootManagerUpdate();
            EventLauncher.AutoStartEvent();
        }
        void Unload() {
            EventLauncher.StopEvent(true);
            PathManager.OnPluginUnloaded();
            ins = null;
        }
        void OnEntitySpawned(LockedByEntCrate entity) {
            if (!entity.IsExists()) return;
            if (entity.ShortPrefabName == "heli_crate") LootManager.OnHeliCrateSpawned(entity);
            else if (entity.ShortPrefabName == "bradley_crate") LootManager.OnBradleyCrateSpawned(entity);
        }
        void OnEntitySpawned(TimedExplosive timedExplosive) {
            if (timedExplosive == null) return;
            if (timedExplosive.ShortPrefabName == "maincannonshell") {
                BradleyVehicle bradleyVehicle = ConvoyPathVehicle.GetClosestVehicle<BradleyVehicle>(timedExplosive.transform.position) as BradleyVehicle;
                if (bradleyVehicle == null) return;
                if (Vector3.Distance(bradleyVehicle.transform.position, timedExplosive.transform.position) < 5f) timedExplosive.SetCreatorEntity(bradleyVehicle.bradley);
            }
        }
        void OnExplosiveThrown(BasePlayer player, BaseEntity entity, ThrownWeapon item) {
            if (!player.IsRealPlayer()) return;
            ConvoyPathVehicle convoyPathVehicle = ConvoyPathVehicle.GetClosestVehicle<ConvoyPathVehicle>(player.transform.position);
            if (convoyPathVehicle != null && Vector3.Distance(convoyPathVehicle.transform.position, player.transform.position) < 20f) eventController.OnEventAttacked(player);
        }
        object CanExplosiveStick(RFTimedExplosive rfTimedExplosive, BaseEntity entity) {
            if (rfTimedExplosive == null || entity == null || entity.net == null) return null;
            ConvoyPathVehicle convoyPathVehicle = ConvoyPathVehicle.GetVehicleByNetId(entity.net.ID.Value);
            if (convoyPathVehicle != null && rfTimedExplosive.GetFrequency() > 0) return false;
            return null;
        }
        object CanMountEntity(BasePlayer player, BaseMountable entity) {
            if (!player.IsRealPlayer() || entity == null) return null;
            BaseEntity vehicle = entity.VehicleParent();
            if (vehicle != null && ConvoyPathVehicle.GetVehicleByNetId(vehicle.net.ID.Value) != null) return true;
            return null;
        }
        object CanDismountEntity(BasePlayer player, BaseMountable baseMountable) {
            if (baseMountable == null || player == null || player.userID.IsSteamId()) return null;
            BaseVehicle baseVehicle = baseMountable.VehicleParent();
            if (baseVehicle == null || baseVehicle.net == null) return null;
            if (ConvoyPathVehicle.GetVehicleByNetId(baseVehicle.net.ID.Value) != null) return true;
            return null;
        }
        void OnPlayerSleep(BasePlayer player) {
            if (!player.IsRealPlayer()) return;
            ZoneController.OnPlayerLeaveZone(player);
        }
        object CanPickupEntity(BasePlayer player, Door door) {
            if (door == null || door.net == null) return null;
            if (ConvoyPathVehicle.GetVehicleByChildNetId(door.net.ID.Value) == null) return null;
            return false;
        }
        object OnEntityTakeDamage(Bike bike, HitInfo info) {
            if (bike == null || bike.net == null || info == null) return null;
            return CheckIfVehicleAttacked(bike, info);
        }
        object OnEntityTakeDamage(BasicCar basicCar, HitInfo info) {
            if (basicCar == null || basicCar.net == null || info == null) return null;
            return CheckIfVehicleAttacked(basicCar, info);
        }
        object OnEntityTakeDamage(BradleyAPC bradley, HitInfo info) {
            if (bradley == null || bradley.net == null || info == null) return null;
            return CheckIfVehicleAttacked(bradley, info);
        }
        object OnEntityTakeDamage(ModularCar modularCar, HitInfo info) {
            if (modularCar == null || modularCar.net == null || info == null) return null;
            return CheckIfVehicleAttacked(modularCar, info);
        }
        object OnEntityTakeDamage(BaseVehicleModule baseVehicleModule, HitInfo info) {
            if (!baseVehicleModule.IsExists()) return null;
            BaseModularVehicle modularCar = baseVehicleModule.Vehicle;
            if (modularCar == null || modularCar.net == null) return null;
            ModularCarVehicle modularCarVehicle = ConvoyPathVehicle.GetVehicleByNetId(modularCar.net.ID.Value) as ModularCarVehicle;
            if (modularCarVehicle == null) return null;
            if (CheckIfVehicleAttacked(modularCar, info) == null) {
                modularCar.health -= info.damageTypes.Total() * modularCarVehicle.modularCarConfig.damageScale / 5;
                if (!modularCar.IsDestroyed && modularCar.health <= 0) modularCar.Kill(BaseNetworkable.DestroyMode.Gib);
                for (int i = 0; i <= modularCar.moduleSockets.Count; i++) {
                    BaseVehicleModule module;
                    if (modularCar.TryGetModuleAt(i, out module)) module.SetHealth(module._maxHealth * modularCar.health / modularCar._maxHealth);
                }
            }
            return true;
        }
        object CheckIfVehicleAttacked(BaseCombatEntity entity, HitInfo info) {
            if (ConvoyPathVehicle.GetVehicleByNetId(entity.net.ID.Value) == null) return null;
            if (!info.InitiatorPlayer.IsRealPlayer()) return true;
            if (!eventController.IsPlayerCanDealDamage(info.InitiatorPlayer, entity, true)) return true;
            eventController.OnEventAttacked(info.InitiatorPlayer);
            return null;
        }
        object OnEntityTakeDamage(AutoTurret autoTurret, HitInfo info) {
            if (autoTurret == null || autoTurret.net == null || info == null) return null;
            return CheckIfConvoyChildAttacked(autoTurret, info);
        }
        object OnEntityTakeDamage(Door door, HitInfo info) {
            if (door == null || door.net == null || info == null) return null;
            return CheckIfConvoyChildAttacked(door, info);
        }
        object OnEntityTakeDamage(SamSite samSite, HitInfo info) {
            if (samSite == null || samSite.net == null || info == null) return null;
            return CheckIfConvoyChildAttacked(samSite, info);
        }
        object CheckIfConvoyChildAttacked(BaseCombatEntity entity, HitInfo info) {
            if (ConvoyPathVehicle.GetVehicleByChildNetId(entity.net.ID.Value) == null) return null;
            if (!info.InitiatorPlayer.IsRealPlayer()) return true;
            if (!eventController.IsPlayerCanDealDamage(info.InitiatorPlayer, entity, true)) return true;
            eventController.OnEventAttacked(info.InitiatorPlayer);
            return null;
        }
        object OnEntityTakeDamage(ScientistNPC scientistNPC, HitInfo info) {
            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(0f);
                return true;
            }
            if (scientistNPC.isMounted) info.damageTypes.ScaleAll(10f);
            eventController.OnEventAttacked(info.InitiatorPlayer);
            float weaponDamageScale;
            if (info.WeaponPrefab != null && eventController.eventConfig.weaponToScaleDamageNpc.TryGetValue(info.WeaponPrefab.ShortPrefabName, out weaponDamageScale)) info.damageTypes.ScaleAll(weaponDamageScale);
            return null;
        }
        object OnEntityTakeDamage(StorageContainer storageContainer, HitInfo info) {
            if (storageContainer == null || storageContainer.net == null) return null;
            if (ConvoyPathVehicle.GetVehicleByChildNetId(storageContainer.net.ID.Value) != null) return true;
            return null;
        }
        object OnEntityTakeDamage(Fridge fridge, HitInfo info) {
            if (fridge == null || fridge.net == null) return null;
            if (ConvoyPathVehicle.GetVehicleByChildNetId(fridge.net.ID.Value) != null) return true;
            return null;
        }
        object OnEntityTakeDamage(PatrolHelicopter patrolHelicopter, HitInfo info) {
            if (patrolHelicopter == null || patrolHelicopter.net == null || info == null) return null;
            EventHeli eventHeli = EventHeli.GetEventHeliByNetId(patrolHelicopter.net.ID.Value);
            if (eventHeli == null) return null;
            if (info.InitiatorPlayer.IsRealPlayer()) {
                if (!eventController.IsPlayerCanDealDamage(info.InitiatorPlayer, patrolHelicopter, true)) return true;
                else {
                    eventHeli.OnHeliAttacked(info.InitiatorPlayer.userID);
                    eventController.OnEventAttacked(info.InitiatorPlayer);
                }
            }
            return null;
        }
        void OnEntityTakeDamage(BuildingBlock buildingBlock, HitInfo info) {
            if (buildingBlock == null || info == null) return;
            CustomBradley customBradley = info.Initiator as CustomBradley;
            if (customBradley != null) {
                if (customBradley.bradleyConfig.bradleyBuildingDamageScale < 0) return;
                else info.damageTypes.ScaleAll(customBradley.bradleyConfig.bradleyBuildingDamageScale);
            }
        }
        void OnEntityDeath(BradleyAPC bradleyAPC, HitInfo info) {
            if (bradleyAPC == null || bradleyAPC.net == null || info == null || !info.InitiatorPlayer.IsRealPlayer()) return;
            ConvoyPathVehicle convoyPathVehicle = ConvoyPathVehicle.GetVehicleByNetId(bradleyAPC.net.ID.Value);
            if (convoyPathVehicle != null) EconomyManager.AddBalance(info.InitiatorPlayer.userID, _config.supportedPluginsConfig.economicsConfig.bradleyPoint);
        }
        void OnEntityDeath(BasicCar basicCar, HitInfo info) {
            if (basicCar == null || basicCar.net == null || info == null || !info.InitiatorPlayer.IsRealPlayer()) return;
            if (ConvoyPathVehicle.GetVehicleByNetId(basicCar.net.ID.Value) != null) EconomyManager.AddBalance(info.InitiatorPlayer.userID, _config.supportedPluginsConfig.economicsConfig.sedanPoint);
        }
        void OnEntityDeath(ModularCar modularCar, HitInfo info) {
            if (modularCar == null || modularCar.net == null || info == null || !info.InitiatorPlayer.IsRealPlayer()) return;
            if (ConvoyPathVehicle.GetVehicleByNetId(modularCar.net.ID.Value) != null) EconomyManager.AddBalance(info.InitiatorPlayer.userID, _config.supportedPluginsConfig.economicsConfig.modularCarPoint);
        }
        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 (ConvoyPathVehicle.GetVehicleByChildNetId(autoTurret.net.ID.Value) != null) EconomyManager.AddBalance(info.InitiatorPlayer.userID, _config.supportedPluginsConfig.economicsConfig.turretPoint);
        }
        void OnEntityDeath(SamSite samSite, HitInfo info) {
            if (samSite == null || samSite.net == null || info == null || !info.InitiatorPlayer.IsRealPlayer()) return;
            if (ConvoyPathVehicle.GetVehicleByChildNetId(samSite.net.ID.Value) != null) EconomyManager.AddBalance(info.InitiatorPlayer.userID, _config.supportedPluginsConfig.economicsConfig.samsitePoint);
        }
        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) EconomyManager.AddBalance(info.InitiatorPlayer.userID, _config.supportedPluginsConfig.economicsConfig.npcPoint);
        }
        void OnEntityKill(BaseMountable baseMountable) {
            if (baseMountable == null || baseMountable.net == null) return;
            BaseVehicle baseVehicle = baseMountable as BaseVehicle;
            if (baseVehicle != null) {
                ConvoyPathVehicle convoyPathVehicle = ConvoyPathVehicle.GetVehicleByNetId(baseVehicle.net.ID.Value);
                if (convoyPathVehicle == null) return;
                foreach (MountPointInfo mountPointInfo in baseVehicle.allMountPoints) {
                    if (mountPointInfo == null || mountPointInfo.mountable == null) continue;
                    BasePlayer mountedPlayer = mountPointInfo.mountable.GetMounted();
                    if (mountedPlayer.IsExists() && !mountedPlayer.userID.IsSteamId()) mountedPlayer.Kill();
                }
                if (EventLauncher.IsEventActive() && ins.eventController.IsFullySpawned()) convoyPathVehicle.DropCrates();
            }
            if (ConvoyPathVehicle.GetVehicleByChildNetId(baseMountable.net.ID.Value) != null) {
                if (baseMountable._mounted.IsExists()) baseMountable._mounted.Kill();
            }
        }
        void OnEntityKill(BradleyAPC bradleyAPC) {
            if (bradleyAPC == null || bradleyAPC.net == null) return;
            ConvoyPathVehicle convoyPathVehicle = ConvoyPathVehicle.GetVehicleByNetId(bradleyAPC.net.ID.Value);
            if (convoyPathVehicle != null && EventLauncher.IsEventActive() && ins.eventController.IsFullySpawned()) convoyPathVehicle.DropCrates();
        }
        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()) 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;
            else 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 (ConvoyPathVehicle.GetVehicleByNetId(bradley.net.ID.Value) == null) return null;
            BasePlayer targetPlayer = entity as BasePlayer;
            if (!targetPlayer.IsRealPlayer()) return false;
            if (targetPlayer.IsSleeping() || (targetPlayer.InSafeZone() && !targetPlayer.IsHostile())) return false;
            return null;
        }
        void OnCorpsePopulate(ScientistNPC scientistNPC, NPCPlayerCorpse corpse) {
            if (scientistNPC == null || corpse == 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();
                }
                );
            }
        }
        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) {
                if (!ins.eventController.IsPlayerCanLoot(player, true)) {
                    eventController.SwitchAgressive(true);
                    return true;
                }
                EconomyManager.AddBalance(player.userID, _config.supportedPluginsConfig.economicsConfig.lockedCratePoint);
                crate.Invoke(() => LootManager.UpdateCrateHackTime(crate, storageContainerData.presetName), 1.1f);
            }
            return null;
        }
        object CanLootEntity(BasePlayer player, StorageContainer storageContainer) {
            return CanLootEventEntity(player, storageContainer);
        }
        object CanLootEntity(BasePlayer player, Fridge fridge) {
            return CanLootEventEntity(player, fridge);
        }
        object CanLootEventEntity(BasePlayer player, BaseEntity entity) {
            if (player == null || entity == null || entity.net == null) return null;
            if (LootManager.GetContainerDataByNetId(entity.net.ID.Value) != null) {
                if (!ins.eventController.IsPlayerCanLoot(player, true)) {
                    eventController.SwitchAgressive(true);
                    return true;
                }
            }
            else {
                BaseVehicleModule baseVehicleModule = entity.GetParentEntity() as BaseVehicleModule;
                if (baseVehicleModule == null || baseVehicleModule.net == null) return null;
                if (ConvoyPathVehicle.GetVehicleByChildNetId(baseVehicleModule.net.ID.Value) != null) return true;
            }
            return null;
        }
        void OnLootEntity(BasePlayer player, StorageContainer storageContainer) {
            if (player == null || storageContainer == null || storageContainer.net == null) return;
            if (LootManager.IsEventCrate(storageContainer.net.ID.Value)) {
                LootManager.OnEventCrateLooted(storageContainer, player.userID);
                eventController.EventPassingCheck();
            }
        }
        void OnLootEntity(BasePlayer player, Fridge fridge) {
            if (player == null || fridge == null || fridge.net == null) return;
            if (LootManager.IsEventCrate(fridge.net.ID.Value)) {
                LootManager.OnEventCrateLooted(fridge, player.userID);
                eventController.EventPassingCheck();
            }
        }
        void OnLootEntityEnd(BasePlayer player, StorageContainer storageContainer) {
            if (storageContainer == null || storageContainer.net == null || !player.IsRealPlayer()) return;
            if (!(storageContainer is LootContainer) && LootManager.GetContainerDataByNetId(storageContainer.net.ID.Value) != null) if (storageContainer.inventory.IsEmpty()) storageContainer.Kill();
        }
        void OnLootEntityEnd(BasePlayer player, Fridge fridge) {
            if (fridge == null || fridge.net == null || !player.IsRealPlayer()) return;
            if (LootManager.GetContainerDataByNetId(fridge.net.ID.Value) != null) if (fridge.inventory.IsEmpty()) fridge.Kill();
        }
        object OnEntityEnter(TriggerVehiclePush trigger, BaseCombatEntity entity) {
            if (trigger == null || entity == null || entity.net == null) return null;
            if (ConvoyPathVehicle.GetVehicleByNetId(entity.net.ID.Value) != null) return true;
            return null;
        }
        object OnEntityEnter(TriggerPath trigger, BradleyAPC bradleyAPC) {
            if (bradleyAPC == null) return null;
            if (ConvoyPathVehicle.GetVehicleByNetId(bradleyAPC.net.ID.Value) == null) return null;
            NextTick(() => bradleyAPC.myRigidBody.isKinematic = false);
            return null;
        }
        object OnEntityEnter(TriggerPath trigger, TravellingVendor travellingVendor) {
            if (travellingVendor == null || travellingVendor.net == null) return null;
            if (ConvoyPathVehicle.GetVehicleByNetId(travellingVendor.net.ID.Value) == null) return null;
            Rigidbody rigidbody = travellingVendor.GetComponentInChildren<Rigidbody>();
            NextTick(() => {
                rigidbody.isKinematic = false;
            }
            );
            return true;
        }
        object OnEntityEnter(TargetTrigger trigger, ScientistNPC scientistNPC) {
            if (trigger == null || scientistNPC == null || scientistNPC.net == null) return null;
            AutoTurret autoTurret = trigger.GetComponentInParent<AutoTurret>();
            if (autoTurret == null || autoTurret.net == null) return null;
            if (NpcSpawnManager.GetScientistByNetId(scientistNPC.net.ID.Value) == null) return null;
            if (scientistNPC.isMounted || !_config.behaviorConfig.isPlayerTurretEnable) return true;
            return null;
        }
        object OnEntityEnter(TriggerVehiclePush trigger, TravellingVendor travellingVendor) {
            if (trigger == null || travellingVendor == null || travellingVendor.net == null) return null;
            if (ConvoyPathVehicle.GetVehicleByNetId(travellingVendor.net.ID.Value)) return true;
            return null;
        }
#region OtherPLugins
        object CanEntityBeTargeted(BasePlayer player, AutoTurret turret) {
            if (eventController == null || turret == null || turret.net == null || turret.OwnerID != 0) return null;
            if (!eventController.IsEventTurret(turret.net.ID.Value)) return null;
            if (!player.IsRealPlayer()) return false;
            else if (!eventController.IsAgressive()) return false;
            else if (!PveModeManager.IsPveModDefaultBlockAction(player)) return true;
            return null;
        }
        object CanEntityBeTargeted(PlayerHelicopter playerHelicopter, SamSite samSite) {
            if (eventController == null || samSite == null || samSite.net == null || samSite.OwnerID != 0) return null;
            if (!eventController.IsEventSamSite(samSite.net.ID.Value)) return null;
            if (!eventController.IsAgressive()) return false;
            return true;
        }
        object CanEntityTakeDamage(Bike bike, HitInfo info) {
            if (eventController == null || info == null || !bike.IsExists() || bike.net == null) return null;
            return CanConvoyVehicleTakeDamage(bike, info);
        }
        object CanEntityTakeDamage(ModularCar modularCar, HitInfo info) {
            if (eventController == null || info == null || !modularCar.IsExists() || modularCar.net == null) return null;
            return CanConvoyVehicleTakeDamage(modularCar, info);
        }
        object CanEntityTakeDamage(BaseVehicleModule baseVehicleModule, HitInfo info) {
            if (eventController == null || info == null || !baseVehicleModule.IsExists() || baseVehicleModule.net == null) return null;
            BaseModularVehicle modularCar = baseVehicleModule.Vehicle;
            if (modularCar == null || modularCar.net == null) return null;
            return CanConvoyVehicleTakeDamage(modularCar, info);
        }
        object CanEntityTakeDamage(BradleyAPC bradleyAPC, HitInfo info) {
            if (eventController == null || info == null || !bradleyAPC.IsExists() || bradleyAPC.net == null) return null;
            return CanConvoyVehicleTakeDamage(bradleyAPC, info);
        }
        object CanEntityTakeDamage(BasicCar basicCar, HitInfo info) {
            if (eventController == null || info == null || !basicCar.IsExists() || basicCar.net == null) return null;
            return CanConvoyVehicleTakeDamage(basicCar, info);
        }
        object CanConvoyVehicleTakeDamage(BaseCombatEntity entity, HitInfo info) {
            if (ConvoyPathVehicle.GetVehicleByNetId(entity.net.ID.Value) == null) return null;
            if (info.InitiatorPlayer.IsRealPlayer()) {
                if (eventController.IsPlayerCanDealDamage(info.InitiatorPlayer, entity, shoudSendMessages : false) && !PveModeManager.IsPveModDefaultBlockAction(info.InitiatorPlayer)) return true;
                else return false;
            }
            else return false;
        }
        object CanEntityTakeDamage(SamSite samSite, HitInfo info) {
            if (eventController == null || info == null || !samSite.IsExists() || samSite.net == null) return null;
            return CheckTruePVEDamageToConvoyChild(samSite, info);
        }
        object CanEntityTakeDamage(AutoTurret autoTurret, HitInfo info) {
            if (eventController == null || info == null || !autoTurret.IsExists() || autoTurret.net == null) return null;
            return CheckTruePVEDamageToConvoyChild(autoTurret, info);
        }
        object CanEntityTakeDamage(Door door, HitInfo info) {
            if (door == null || door.net == null || info == null) return null;
            return CheckTruePVEDamageToConvoyChild(door, info);
        }
        object CheckTruePVEDamageToConvoyChild(BaseCombatEntity entity, HitInfo info) {
            if (ConvoyPathVehicle.GetVehicleByChildNetId(entity.net.ID.Value) == null) return null;
            if (info.InitiatorPlayer.IsRealPlayer()) {
                if (eventController.IsPlayerCanDealDamage(info.InitiatorPlayer, entity, shoudSendMessages : true) && !PveModeManager.IsPveModDefaultBlockAction(info.InitiatorPlayer)) return true;
                else return false;
            }
            else return false;
        }
        object CanEntityTakeDamage(BasePlayer victim, HitInfo info) {
            if (info == null || info.Initiator == null || info.Initiator.net == null) return null;
            if (victim.IsRealPlayer()) {
                if (_config.zoneConfig.isPVPZone && !_config.supportedPluginsConfig.pveMode.enable) {
                    if (info.InitiatorPlayer.IsRealPlayer() && ZoneController.IsPlayerInZone(info.InitiatorPlayer.userID) && ZoneController.IsPlayerInZone(victim.userID)) return true;
                }
                if (info.Initiator is AutoTurret or SamSite) {
                    if (ConvoyPathVehicle.GetVehicleByChildNetId(info.Initiator.net.ID.Value) != null) return true;
                }
            }
            ScientistNPC scientistNPC = victim as ScientistNPC;
            if (scientistNPC != null && scientistNPC.net != null && NpcSpawnManager.GetScientistByNetId(scientistNPC.net.ID.Value) != null) {
                AutoTurret autoTurret = info.Initiator as AutoTurret;
                if (autoTurret != null && autoTurret.net != null && !eventController.IsEventTurret(autoTurret.net.ID.Value)) return true;
            }
            return null;
        }
        object CanEntityTakeDamage(PlayerHelicopter playerHelicopter, HitInfo info) {
            if (info == null || info.Initiator == null || info.Initiator.net == null) return null;
            if (info.Initiator is SamSite) {
                if (ConvoyPathVehicle.GetVehicleByChildNetId(info.Initiator.net.ID.Value) != null) return true;
            }
            return null;
        }
        object CanBradleySpawnNpc(BradleyAPC bradley) {
            if (eventController == null || bradley == null || bradley.net == null) return null;
            if (!_config.supportedPluginsConfig.betterNpcConfig.bradleyNpc && ConvoyPathVehicle.GetVehicleByNetId(bradley.net.ID.Value) != null) return true;
            return null;
        }
        object CanHelicopterSpawnNpc(PatrolHelicopter helicopter) {
            if (eventController == null || helicopter == null || helicopter.net == null) return null;
            if (!_config.supportedPluginsConfig.betterNpcConfig.heliNpc && EventHeli.GetEventHeliByNetId(helicopter.net.ID.Value) != null) 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 (ConvoyPathVehicle.GetVehicleByNetId(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.isLootTablePLugin) return true;
            return null;
        }
        void SetOwnerPveMode(string shortname, BasePlayer player) {
            if (eventController == null || string.IsNullOrEmpty(shortname) || shortname != Name || !player.IsRealPlayer()) return;
            if (shortname == Name) PveModeManager.OnNewOwnerSet(player);
        }
        void ClearOwnerPveMode(string shortname) {
            if (eventController == null || string.IsNullOrEmpty(shortname)) return;
            if (shortname == Name) PveModeManager.OnOwnerDeleted();
        }
        object OnSetupTurret(AutoTurret autoTurret) {
            if (autoTurret == null || autoTurret.net == null) return null;
            if (ConvoyPathVehicle.GetVehicleByChildNetId(autoTurret.net.ID.Value) != null) return true;
            return null;
        }
#endregion OtherPLugins
#endregion Hooks
#region Commands
        [ChatCommand("convoystart")]
        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);
            }
        }
        [ConsoleCommand("convoystart")]
        void ConsoleStartEventCommand(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);
            }
        }
        [ChatCommand("convoystop")]
        void ChatStopCommand(BasePlayer player, string command, string[] arg) {
            if (player.IsAdmin) EventLauncher.StopEvent();
        }
        [ConsoleCommand("convoystop")]
        void ConsoleStopEventCommand(ConsoleSystem.Arg arg) {
            if (arg.Player() != null) return;
            EventLauncher.StopEvent();
        }
        [ChatCommand("convoyroadblock")]
        void ChatRoadBlockCommand(BasePlayer player, string command, string[] arg) {
            if (!player.IsAdmin) return;
            PathList blockRoad = TerrainMeta.Path.Roads.FirstOrDefault(x => x.Path.Points.Any(y => Vector3.Distance(player.transform.position, y) < 10));
            if (blockRoad == null) {
                NotifyManager.SendMessageToPlayer(player, $"{_config.prefix} Road <color=#ce3f27>not found</color>.Step onto the required road and enter the command again.");
                return;
            }
            int index = TerrainMeta.Path.Roads.IndexOf(blockRoad);
            if (_config.pathConfig.blockRoads.Contains(index)) {
                NotifyManager.SendMessageToPlayer(player, $"{_config.prefix} The road is already <color=#ce3f27>blocked</color>");
                return;
            }
            _config.pathConfig.blockRoads.Add(index);
            SaveConfig();
            NotifyManager.SendMessageToPlayer(player, $"{_config.prefix} The road with the index <color=#738d43>{index}</color> is <color=#ce3f27>blocked</color>");
        }
        [ChatCommand("convoyshowpath")]
        void ChatShowPathCommand(BasePlayer player, string command, string[] arg) {
            if (player.IsAdmin) PathManager.DdrawPath(PathManager.currentPath, player);
        }
        [ChatCommand("convoypathstart")]
        void ChatPathStartCommand(BasePlayer player, string command, string[] arg) {
            if (!player.IsAdmin) return;
            PathRecorder.StartRecordingRoute(player);
        }
        [ChatCommand("convoypathsave")]
        void ChatPathSaveCommand(BasePlayer player, string command, string[] arg) {
            if (!player.IsAdmin) return;
            if (arg.Length == 0) {
                NotifyManager.SendMessageToPlayer(player, "CustomRouteDescription", ins._config.prefix);
                return;
            }
            string pathName = arg[0];
            PathRecorder.TrySaveRoute(player.userID, pathName);
        }
        [ChatCommand("convoypathcancel")]
        void ChatPathCancelCommand(BasePlayer player, string command, string[] arg) {
            if (!player.IsAdmin) return;
            PathRecorder.TryCancelRoute(player.userID);
        }
        [ChatCommand("convoystartmoving")]
        void ChatStartMovingCommand(BasePlayer player, string command, string[] arg) {
            if (!player.IsAdmin) return;
            ins.eventController.SwitchMoving(true);
        }
        [ChatCommand("convoystopmoving")]
        void ChatStopMovingCommand(BasePlayer player, string command, string[] arg) {
            if (!player.IsAdmin) return;
            ins.eventController.SwitchMoving(false);
        }
        [ChatCommand("convoytest")]
        void ChatTestCommand(BasePlayer player, string command, string[] arg) {
            if (!player.IsAdmin) return;
            BasePlayer basePlayer = BuildManager.SpawnRegularEntity("assets/prefabs/player/player.prefab", player.transform.position, Quaternion.identity) as BasePlayer;
            basePlayer.StartSleeping();
        }
#endregion Commands
#region Method
        void Unsubscribes() {
            foreach (string hook in subscribeMetods) Unsubscribe(hook);
        }
        void Subscribes() {
            foreach (string hook in subscribeMetods) Subscribe(hook);
        }
        static void Debug(params object[] arg) {
            string result = "";
            foreach (object obj in arg) if (obj != null) result += obj.ToString() + " ";
            ins.Puts(result);
        }
#endregion Method
#region Classes
        static class EventLauncher {
            static Coroutine autoEventCoroutine;
            static Coroutine delayedEventStartCorountine;
            internal static bool IsEventActive() {
                return ins != null && ins.eventController != null;
            }
            internal static void AutoStartEvent() {
                if (!ins._config.mainConfig.isAutoEvent) return;
                if (autoEventCoroutine != null) ServerMgr.Instance.StopCoroutine(autoEventCoroutine);
                autoEventCoroutine = ServerMgr.Instance.StartCoroutine(AutoEventCorountine());
            }
            internal static void DelayStartEvent(bool isAutoActivated = false, BasePlayer activator = null, string presetName = "") {
                if (IsEventActive() || delayedEventStartCorountine != null) {
                    NotifyManager.PrintError(activator, "EventActive_Exeption");
                    return;
                }
                if (autoEventCoroutine != null) ServerMgr.Instance.StopCoroutine(autoEventCoroutine);
                EventConfig eventConfig = DefineEventConfig(presetName);
                if (eventConfig == null) {
                    NotifyManager.PrintError(activator, "ConfigurationNotFound_Exeption");
                    StopEvent();
                    return;
                }
                delayedEventStartCorountine = ServerMgr.Instance.StartCoroutine(DelayedStartEventCorountine(eventConfig));
                if (!isAutoActivated) NotifyManager.PrintInfoMessage(activator, "SuccessfullyLaunched");
            }
            static IEnumerator AutoEventCorountine() {
                yield return CoroutineEx.waitForSeconds(UnityEngine.Random.Range(ins._config.mainConfig.minTimeBetweenEvents, ins._config.mainConfig.maxTimeBetweenEvents));
                yield return CoroutineEx.waitForSeconds(5f);
                DelayStartEvent(true);
            }
            static IEnumerator DelayedStartEventCorountine(EventConfig eventConfig) {
                if (ins._config.mainConfig.preStartTime > 0) NotifyManager.SendMessageToAll("PreStart", ins._config.prefix, ins._config.mainConfig.preStartTime);
                yield return CoroutineEx.waitForSeconds(ins._config.mainConfig.preStartTime);
                StartEvent(eventConfig);
            }
            static void StartEvent(EventConfig eventConfig) {
                GameObject gameObject = new GameObject();
                ins.eventController = gameObject.AddComponent<EventController>();
                ins.eventController.Init(eventConfig);
                if (ins._config.mainConfig.enableStartStopLogs) NotifyManager.PrintLogMessage("EventStart_Log", eventConfig.presetName);
                Interface.CallHook($"On{ins.Name}Start");
            }
            internal static void StopEvent(bool isPluginUnloadingOrFailed = false) {
                if (IsEventActive()) {
                    ins.Unsubscribes();
                    ins.eventController.DeleteController();
                    ZoneController.TryDeleteZone();
                    PveModeManager.OnEventEnd();
                    EventMapMarker.DeleteMapMarker();
                    NpcSpawnManager.ClearData(true);
                    LootManager.ClearLootData();
                    GuiManager.DestroyAllGui();
                    EconomyManager.OnEventEnd();
                    EventHeli.ClearData();
                    NotifyManager.SendMessageToAll("Finish", ins._config.prefix);
                    Interface.CallHook($"On{ins.Name}Stop");
                    if (ins._config.mainConfig.enableStartStopLogs) NotifyManager.PrintLogMessage("EventStop_Log");
                    if (!isPluginUnloadingOrFailed) AutoStartEvent();
                }
                if (delayedEventStartCorountine != null) {
                    ServerMgr.Instance.StopCoroutine(delayedEventStartCorountine);
                    delayedEventStartCorountine = null;
                }
            }
            static EventConfig DefineEventConfig(string eventPresetName) {
                if (eventPresetName != "") return ins._config.eventConfigs.FirstOrDefault(x => x.presetName == eventPresetName);
                HashSet<EventConfig> suitableEventConfigs = ins._config.eventConfigs.Where(x => x.chance > 0 && x.isAutoStart && IsEventConfigSuitableByTime(x));
                if (suitableEventConfigs == null || suitableEventConfigs.Count == 0) return null;
                float sumChance = 0;
                foreach (EventConfig eventConfig in suitableEventConfigs) sumChance += eventConfig.chance;
                float random = UnityEngine.Random.Range(0, sumChance);
                foreach (EventConfig eventConfig in suitableEventConfigs) {
                    random -= eventConfig.chance;
                    if (random <= 0) return eventConfig;
                }
                return null;
            }
            static bool IsEventConfigSuitableByTime(EventConfig eventConfig) {
                if (eventConfig.minTimeAfterWipe <= 0 && eventConfig.maxTimeAfterWipe <= 0) return true;
                int timeScienceWipe = GetTimeScienceLastWipe();
                if (timeScienceWipe < eventConfig.minTimeAfterWipe) return false;
                if (eventConfig.maxTimeAfterWipe > 0 && timeScienceWipe > eventConfig.maxTimeAfterWipe) return false;
                return true;
            }
            static int GetTimeScienceLastWipe() {
                DateTime startTime = new DateTime(2019, 1, 1, 0, 0, 0);
                double realTime = DateTime.UtcNow.Subtract(startTime).TotalSeconds;
                double wipeTime = SaveRestore.SaveCreatedTime.Subtract(startTime).TotalSeconds;
                return Convert.ToInt32(realTime - wipeTime);
            }
        }
        class EventController : FacepunchBehaviour {
            internal EventConfig eventConfig;
            HashSet<NpcData> npcDatas = new HashSet<NpcData>();
            HashSet<AutoTurret> turrets = new HashSet<AutoTurret>();
            HashSet<SamSite> samsites = new HashSet<SamSite>();
            Coroutine spawnCoroutine;
            Coroutine eventCoroutine;
            int eventTime;
            int agressiveTime;
            int stopTime;
            bool isStopped;
            bool isEventLooted;
            internal int GetEventTime() {
                return eventTime;
            }
            internal bool IsFullySpawned() {
                return spawnCoroutine == null;
            }
            internal bool IsStopped() {
                return isStopped;
            }
            internal bool IsAgressive() {
                return ins._config.behaviorConfig.agressiveTime < 0 || agressiveTime > 0;
            }
            internal HashSet<ulong> GetAliveTurretsNetIDS() {
                HashSet<ulong> turretsIDs = 
// ... [Code preview truncated due to length. Full source in attached file] ...

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

Другие ресурсы пользователя 15FPS

Сверху