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

FREE Caravan : 1.1.7 1.1.7

Нет прав для скачивания
C#:
using Facepunch;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using Oxide.Core;
using Oxide.Core.Plugins;
using Oxide.Game.Rust.Cui;
using Oxide.Plugins.CaravanExtensionMethods;
using System;
using System.Collections;
using System.Collections.Generic;
using System.Data;
using System.IO;
using System.Reflection;
using UnityEngine;
using UnityEngine.AI;
using static BaseAIBrain;
namespace Oxide.Plugins {
    [Info("Caravan", "Adem", "1.1.7")]
    class Caravan : RustPlugin {
#region Variables
        const bool en = false;
        static Caravan ins;
        [PluginReference]
        Plugin NpcSpawn, GUIAnnouncements, DiscordMessages, Notify, PveMode, Economics, ServerRewards, IQEconomic, DynamicPVP, ArmoredTrain;
        HashSet<string> subscribeMetods = new HashSet<string> {
            "OnEntityTakeDamage", "OnPlayerDeath", "OnEntityDeath", "OnEntityKill", "OnCorpsePopulate", "CanMountEntity", "CanDismountEntity", "OnHorseLead", "CanLootEntity", "CanHackCrate", "OnLootEntity", "OnLootEntityEnd", "OnSamSiteTarget", "CanEntityBeTargeted", "CanEntityTakeDamage", "OnCustomNpcTarget", "CanPopulateLoot", "OnCustomLootContainer", "OnCustomLootNPC", "SetOwnerPveMode", "ClearOwnerPveMode", "OnPlayerViolation"
        }
        ;
        EventController eventController;
#endregion Variables
#region Hooks
        void Init() {
            Unsubscribes();
        }
        void OnServerInitialized() {
            ins = this;
            if (!NpcSpawnManager.IsNpcSpawnReady()) return;
            UpdateConfig();
            LoadDefaultMessages();
            GuiManager.LoadImages();
            LootManager.InitialLootManagerUpdate();
            PathManager.StartCachingRouts();
            EventLauncher.AutoStartEvent();
        }
        void Unload() {
            EventLauncher.StopEvent(true);
            PathManager.OnPluginUnloaded();
            ins = null;
        }
        object OnEntityTakeDamage(RidableHorse ridableHorse, HitInfo info) {
            if (!ridableHorse.IsExists() || info == null || ridableHorse.net == null || info.Initiator == null) return null;
            HorseCarriage horseCarriage = HorseCarriage.GetCarriageByHorseNetID(ridableHorse.net.ID.Value);
            Horseman horseman = Horseman.GetHorsemanByNetID(ridableHorse.net.ID.Value);
            if (horseCarriage != null || horseman != null) {
                if (info.InitiatorPlayer.IsRealPlayer()) {
                    if (eventController.IsPlayerCanDealDamage(info.InitiatorPlayer, ridableHorse, shoudSendMessages : true) && !PveModeManager.IsPveModeBlockAction(info.InitiatorPlayer)) {
                        eventController.OnEventAttacked(info.InitiatorPlayer);
                        return null;
                    }
                    else return true;
                }
                else return true;
            }
            return null;
        }
        object OnEntityTakeDamage(ModularCar modularCar, HitInfo info) {
            if (!modularCar.IsExists() || info == null || modularCar.net == null || info.Initiator == null) return null;
            HorseCarriage horseCarriage = HorseCarriage.GetCarriageByModularCarNetID(modularCar.net.ID.Value);
            if (horseCarriage != null) {
                if (info.InitiatorPlayer.IsRealPlayer()) {
                    if (eventController.IsPlayerCanDealDamage(info.InitiatorPlayer, modularCar, shoudSendMessages : true) && !PveModeManager.IsPveModeBlockAction(info.InitiatorPlayer)) {
                        eventController.OnEventAttacked(info.InitiatorPlayer);
                        return null;
                    }
                    else return true;
                }
                else return true;
            }
            return null;
        }
        object OnEntityTakeDamage(BaseVehicleModule baseVehicleModule, HitInfo info) {
            if (!baseVehicleModule.IsExists() || info == null || baseVehicleModule.net == null || info.Initiator == null) return null;
            BaseModularVehicle modularCar = baseVehicleModule.Vehicle;
            if (modularCar == null || modularCar.net == null) return null;
            HorseCarriage horseCarriage = HorseCarriage.GetCarriageByModularCarNetID(modularCar.net.ID.Value);
            if (horseCarriage != null) {
                if (info.InitiatorPlayer.IsRealPlayer()) {
                    if (eventController.IsPlayerCanDealDamage(info.InitiatorPlayer, modularCar, shoudSendMessages : true)) {
                        eventController.OnEventAttacked(info.InitiatorPlayer);
                        return null;
                    }
                    else return true;
                }
                else return true;
            }
            return null;
        }
        object OnEntityTakeDamage(HotAirBalloon hotAirBalloon, HitInfo info) {
            if (!hotAirBalloon.IsExists() || info == null || hotAirBalloon.net == null || info.Initiator == null) return null;
            AirBalloon airBalloon = AirBalloon.GetAirBalloonByNetID(hotAirBalloon.net.ID.Value);
            if (airBalloon != null) {
                if (info.InitiatorPlayer.IsRealPlayer()) {
                    if (eventController.IsPlayerCanDealDamage(info.InitiatorPlayer, hotAirBalloon, shoudSendMessages : true) && !PveModeManager.IsPveModeBlockAction(info.InitiatorPlayer)) {
                        eventController.OnEventAttacked(info.InitiatorPlayer);
                        return null;
                    }
                    else return true;
                }
                SamSite samSite = info.Initiator as SamSite;
                if (samSite != null) {
                    if (samSite.ShortPrefabName == "sam_static") return true;
                    else if (ins._config.damageConfig.isPlayerSamSiteCanAttackEvent) return null;
                }
                return true;
            }
            return null;
        }
        object OnEntityTakeDamage(ScientistNPC scientistNPC, HitInfo info) {
            if (!scientistNPC.IsExists() || info == null || scientistNPC.net == null || !info.InitiatorPlayer.IsRealPlayer()) return null;
            if (NpcSpawnManager.GetScientistByNetId(scientistNPC.net.ID.Value) == null) return null;
            if (info.InitiatorPlayer.IsRealPlayer()) {
                if (eventController.IsPlayerCanDealDamage(info.InitiatorPlayer, scientistNPC, shoudSendMessages : true)) {
                    if (scientistNPC.isMounted) info.damageTypes.ScaleAll(10);
                    eventController.OnEventAttacked(info.InitiatorPlayer);
                    return null;
                }
                else return true;
            }
            return null;
        }
        void OnPlayerDeath(BasePlayer player, HitInfo info) {
            if (player == null || info == null) return;
            if (ZoneController.IsPlayerInZone(player.userID)) ZoneController.OnPlayerLeaveZone(player);
        }
        void OnEntityDeath(ScientistNPC scientistNPC, HitInfo info) {
            if (scientistNPC == null || info == null || scientistNPC.net == null) return;
            if (info.InitiatorPlayer.IsRealPlayer() && NpcSpawnManager.IsEventNpc(scientistNPC)) {
                Horseman horseman = Horseman.GetHorsemanByNpcNetId(scientistNPC.net.ID.Value);
                if (horseman != null) EconomyManager.AddBalance(info.InitiatorPlayer.userID, _config.economicsConfig.horsemanPoint);
                else EconomyManager.AddBalance(info.InitiatorPlayer.userID, _config.economicsConfig.npcPoint);
            }
        }
        void OnEntityDeath(RidableHorse ridableHorse, HitInfo info) {
            if (ridableHorse == null || info == null || ridableHorse.net == null) return;
            if (info.InitiatorPlayer.IsRealPlayer()) {
                Horseman horseman = Horseman.GetHorsemanByHorseNetId(ridableHorse.net.ID.Value);
                if (horseman != null) EconomyManager.AddBalance(info.InitiatorPlayer.userID, _config.economicsConfig.horsemanPoint);
            }
        }
        void OnEntityKill(RidableHorse ridableHorse) {
            if (!ridableHorse.IsExists() || ridableHorse.net == null) return;
            HorseCarriage horseCarriage = HorseCarriage.GetCarriageByHorseNetID(ridableHorse.net.ID.Value);
            if (horseCarriage != null) ins.NextTick(() => eventController.EventPassingCheck());
        }
        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 CanMountEntity(BasePlayer player, BaseMountable baseMountable) {
            if (!player.IsRealPlayer() || baseMountable == null) return null;
            BaseVehicle baseVehicle = baseMountable.VehicleParent();
            if (!baseVehicle.IsExists() || baseVehicle.net == null) return null;
            if (baseVehicle is RidableHorse) {
                Horseman horseman = Horseman.GetHorsemanByNetID(baseVehicle.net.ID.Value);
                HorseCarriage horseCarriage = HorseCarriage.GetCarriageByHorseNetID(baseVehicle.net.ID.Value);
                if (horseCarriage != null || horseman != 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.IsExists() || baseVehicle.net == null) return null;
            if (baseVehicle is RidableHorse) {
                Horseman horseman = Horseman.GetHorsemanByNetID(baseVehicle.net.ID.Value);
                if (horseman != null) return true;
            }
            return null;
        }
        object OnHorseLead(RidableHorse ridableHorse, BasePlayer player) {
            if (!ridableHorse.IsExists() || ridableHorse.net == null) return null;
            HorseCarriage horseCarriage = HorseCarriage.GetCarriageByHorseNetID(ridableHorse.net.ID.Value);
            Horseman horseman = Horseman.GetHorsemanByNetID(ridableHorse.net.ID.Value);
            if (horseCarriage != null || horseman != null) return true;
            return null;
        }
        object CanLootEntity(BasePlayer player, LootContainer lootContainer) {
            if (player == null || lootContainer == null || lootContainer.net == null) return null;
            if (LootManager.GetContainerDataByNetId(lootContainer.net.ID.Value) != null) {
                if (!ins.eventController.IsPlayerCanLootCaravan(player, true)) {
                    eventController.MakeCaravanAgressive();
                    return true;
                }
            }
            return null;
        }
        object CanLootEntity(BasePlayer player, StorageContainer storageContainer) {
            if (player == null || storageContainer == null || storageContainer.net == null) return null;
            if (LootManager.GetContainerDataByNetId(storageContainer.net.ID.Value) != null) {
                if (!ins.eventController.IsPlayerCanLootCaravan(player, true)) {
                    eventController.MakeCaravanAgressive();
                    return true;
                }
            }
            return null;
        }
        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.IsPlayerCanLootCaravan(player, true)) {
                    eventController.MakeCaravanAgressive();
                    return true;
                }
                LootManager.UpdateCrateHackTime(crate, storageContainerData.presetName);
            }
            return null;
        }
        void OnLootEntity(BasePlayer player, LootContainer lootContainer) {
            if (player == null || lootContainer == null || lootContainer.net == null) return;
            if (LootManager.IsEventCrate(lootContainer.net.ID.Value)) {
                LootManager.OnEventCrateLooted(lootContainer, player.userID);
                eventController.EventPassingCheck();
            }
        }
        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 OnLootEntityEnd(BasePlayer player, StorageContainer storageContainer) {
            if (storageContainer == null || storageContainer.net == null || !player.IsRealPlayer()) return;
            if (LootManager.GetContainerDataByNetId(storageContainer.net.ID.Value) != null) if (storageContainer.inventory.IsEmpty()) storageContainer.Kill();
        }
        object OnSamSiteTarget(SamSite samSite, HotAirBalloon hotAirBalloon) {
            if (samSite == null || hotAirBalloon == null || hotAirBalloon.net == null) return null;
            AirBalloon airBalloon = AirBalloon.GetAirBalloonByNetID(hotAirBalloon.net.ID.Value);
            if (airBalloon != null) {
                if (samSite.ShortPrefabName == "sam_static") return true;
                else if (!ins._config.damageConfig.isPlayerSamSiteCanAttackEvent) return true;
            }
            return null;
        }
        object OnPlayerViolation(BasePlayer player, AntiHackType type, float amount) {
            if (player == null) return null;
            if (type == AntiHackType.FlyHack && eventController.IsCaravanLooted()) return true;
            return null;
        }
#region OtherPlugins
        object CanEntityBeTargeted(HotAirBalloon hotAirBalloon, SamSite samSite) {
            if (samSite == null || hotAirBalloon == null || hotAirBalloon.net == null) return null;
            AirBalloon airBalloon = AirBalloon.GetAirBalloonByNetID(hotAirBalloon.net.ID.Value);
            if (airBalloon != null) {
                if (samSite.ShortPrefabName == "sam_static") return false;
                else if (ins._config.damageConfig.isPlayerSamSiteCanAttackEvent) return true;
                else return false;
            }
            return null;
        }
        object CanEntityTakeDamage(RidableHorse ridableHorse, HitInfo info) {
            if (eventController == null || info == null || !ridableHorse.IsExists() || ridableHorse.net == null || info.Initiator == null) return null;
            HorseCarriage horseCarriage = HorseCarriage.GetCarriageByHorseNetID(ridableHorse.net.ID.Value);
            Horseman horseman = Horseman.GetHorsemanByNetID(ridableHorse.net.ID.Value);
            if (horseCarriage != null || horseman != null) {
                if (info.InitiatorPlayer.IsRealPlayer()) {
                    if (eventController.IsPlayerCanDealDamage(info.InitiatorPlayer, ridableHorse, shoudSendMessages : true) && !PveModeManager.IsPveModeBlockAction(info.InitiatorPlayer)) return true;
                    else return false;
                }
                else return false;
            }
            return null;
        }
        object CanEntityTakeDamage(ModularCar modularCar, HitInfo info) {
            if (eventController == null || info == null || !modularCar.IsExists() || modularCar.net == null || info.Initiator == null) return null;
            HorseCarriage horseCarriage = HorseCarriage.GetCarriageByModularCarNetID(modularCar.net.ID.Value);
            if (horseCarriage != null) {
                if (info.InitiatorPlayer.IsRealPlayer()) {
                    if (eventController.IsPlayerCanDealDamage(info.InitiatorPlayer, modularCar, shoudSendMessages : true) && !PveModeManager.IsPveModeBlockAction(info.InitiatorPlayer)) return true;
                    else return false;
                }
                else return false;
            }
            return null;
        }
        object CanEntityTakeDamage(BaseVehicleModule baseVehicleModule, HitInfo info) {
            if (eventController == null || info == null || !baseVehicleModule.IsExists() || baseVehicleModule.net == null || info.Initiator == null) return null;
            BaseModularVehicle modularCar = baseVehicleModule.Vehicle;
            if (modularCar == null || modularCar.net == null) return null;
            HorseCarriage horseCarriage = HorseCarriage.GetCarriageByModularCarNetID(modularCar.net.ID.Value);
            if (horseCarriage != null) {
                if (info.InitiatorPlayer.IsRealPlayer()) {
                    if (eventController.IsPlayerCanDealDamage(info.InitiatorPlayer, modularCar, shoudSendMessages : true) && !PveModeManager.IsPveModeBlockAction(info.InitiatorPlayer)) return true;
                    else return false;
                }
                else return false;
            }
            return null;
        }
        object CanEntityTakeDamage(HotAirBalloon hotAirBalloon, HitInfo info) {
            if (eventController == null || info == null || !hotAirBalloon.IsExists() || hotAirBalloon.net == null || info.Initiator == null) return null;
            AirBalloon airBalloon = AirBalloon.GetAirBalloonByNetID(hotAirBalloon.net.ID.Value);
            if (airBalloon != null) {
                if (info.InitiatorPlayer.IsRealPlayer()) {
                    if (eventController.IsPlayerCanDealDamage(info.InitiatorPlayer, hotAirBalloon, shoudSendMessages : true) && !PveModeManager.IsPveModeBlockAction(info.InitiatorPlayer)) return true;
                    else return false;
                }
                SamSite samSite = info.Initiator as SamSite;
                if (samSite != null) {
                    if (samSite.ShortPrefabName == "sam_static") return false;
                    else if (ins._config.damageConfig.isPlayerSamSiteCanAttackEvent) return true;
                }
                else return false;
            }
            return null;
        }
        object CanEntityTakeDamage(ScientistNPC scientistNPC, HitInfo info) {
            if (eventController == null || info == null || !scientistNPC.IsExists() || scientistNPC.net == null || info.Initiator == null) return null;
            NpcConfig npcConfig = NpcSpawnManager.GetNpcConfigByDisplayName(scientistNPC.displayName);
            if (npcConfig != null) {
                if (info.InitiatorPlayer.IsRealPlayer()) {
                    if (eventController.IsPlayerCanDealDamage(info.InitiatorPlayer, scientistNPC, shoudSendMessages : true)) return null;
                    else return false;
                }
            }
            return null;
        }
        object CanEntityTakeDamage(BasePlayer victim, HitInfo hitinfo) {
            if (eventController == null || hitinfo == 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;
            }
            return null;
        }
        object OnCustomNpcTarget(ScientistNPC scientistNPC, BasePlayer player) {
            if (scientistNPC == null) return null;
            if (ins._config.behaviorConfig.agressiveTime < 0) return null;
            NpcConfig npcConfig = NpcSpawnManager.GetNpcConfigByDisplayName(scientistNPC.displayName);
            if (npcConfig != null) {
                if (eventController.IsCaravanAgressive()) return null;
                else return false;
            }
            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;
        }
        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();
        }
#endregion OtherPlugins
#endregion Hooks
#region Commands
        [ChatCommand("caravanstart")]
        void ChatStartEventCommand(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("caravanstart")]
        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("caravanstop")]
        void ChatStopEventCommand(BasePlayer player, string command, string[] arg) {
            if (!player.IsAdmin) return;
            EventLauncher.StopEvent();
        }
        [ConsoleCommand("caravanstop")]
        void ConsoleStopEventCommand(ConsoleSystem.Arg arg) {
            if (arg.Player() != null) return;
            EventLauncher.StopEvent();
        }
        [ChatCommand("caravanpathstart")]
        void ChatPathStartCommand(BasePlayer player, string command, string[] arg) {
            if (!player.IsAdmin) return;
            PathRecorder.StartRecordingRoute(player);
        }
        [ChatCommand("caravanpathsave")]
        void ChatPathSaveCommand(BasePlayer player, string command, string[] arg) {
            if (!player.IsAdmin) return;
            if (arg.Length == 0) {
                NotifyManager.SendMessageToPlayer(player, "CustomRouteDescription", ins._config.notifyConfig.prefix);
                return;
            }
            string pathName = arg[0];
            PathRecorder.TrySaveRoute(player.userID, pathName);
        }
        [ChatCommand("caravanpathcancel")]
        void ChatPathCancelCommand(BasePlayer player, string command, string[] arg) {
            if (!player.IsAdmin) return;
            PathRecorder.TryCancelRoute(player.userID);
        }
        [ChatCommand("showroute")]
        void ChatShowRouteCommand(BasePlayer player, string command, string[] arg) {
            PathManager.DdrawPath(PathManager.currentPath, player);
        }
        [ConsoleCommand("savecaravancart")]
        void ConsoleSaveCustomWagonCommand(ConsoleSystem.Arg arg) {
            if (arg.Player() != null) return;
            string wagonShortPrefabName = arg.Args[0];
            CarCustomizator.MapSaver.CreateOrAddNewWagonToData(wagonShortPrefabName);
        }
        [ChatCommand("caravanroadblock")]
        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.notifyConfig.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.notifyConfig.prefix} The road is already <color=#ce3f27>blocked</color>");
                return;
            }
            _config.pathConfig.blockRoads.Add(index);
            SaveConfig();
            NotifyManager.SendMessageToPlayer(player, $"{_config.notifyConfig.prefix} The road with the index <color=#738d43>{index}</color> is <color=#ce3f27>blocked</color>");
        }
        [ChatCommand("caravantest")]
        void ChatTestkCommand(BasePlayer player, string command, string[] arg) {
            if (!player.IsAdmin) return;
            BasicCar baseEntity = BuildManager.SpawnRegularEntity("assets/content/vehicles/sedan_a/sedantest.entity.prefab", player.transform.position, Quaternion.identity) as BasicCar;
            foreach (TriggerBase triggerBase in baseEntity.gameObject.GetComponentsInChildren<TriggerBase>()) Debug(triggerBase.GetType());
            baseEntity.rigidBody.detectCollisions = false;
        }
#endregion Commands
#region Methods
        void UpdateConfig() {
            if (IsFrontierMap()) {
                List<string> frontierMapRoutesNames = new List<string> {
                    "Frontier_1", "Frontier_2", "Frontier_3", "Frontier_4"
                }
                ;
                if (_config.pathConfig.pathType != 2) {
                    PrintError("There are no roads on this map! The plugin can only work with custom routes!\n1.Upload the data files that come with the map to the oxide/data/Caravan/Custom routes folder \n2.Change 'Type of caravan routes' to custom in config");
                    ins.NextTick(() => ins.Server.Command($"o.unload {ins.Name}"));
                }
                else if (!_config.pathConfig.customPathConfig.customRoutesPresets.Any(x => x.Contains("Frontier"))) foreach (string name in frontierMapRoutesNames) if (!_config.pathConfig.customPathConfig.customRoutesPresets.Contains(name)) _config.pathConfig.customPathConfig.customRoutesPresets.Add(name);
            }
            if (_config.version != Version) {
                if (_config.version.Minor == 0) {
                    if (_config.version.Patch <= 1) {
                        _config.supportedPluginsConfig.pveMode.scaleDamage = new Dictionary<string, float> {
                            ["Npc"]
                            = 1f,
                        }
                        ;
                    }
                    if (_config.version.Patch <= 6) {
                        _config.supportedPluginsConfig.pveMode.showEventOwnerNameOnMap = true;
                    }
                    _config.version = new VersionNumber(1, 1, 0);
                }
                if (_config.version.Minor == 1) {
                    if (_config.version.Patch == 0) {
                        _config.zoneConfig.isColoredBorder = false;
                        _config.zoneConfig.brightness = 5;
                        _config.zoneConfig.borderColor = 2;
                        _config.notifyConfig.redefinedMessages = new HashSet<RedefinedMessageConfig> {
                            new RedefinedMessageConfig {
                                langKey = "Replace it with the required lang key", isEnable = true, chatConfig = new ChatConfig {
                                    isEnabled = false,
                                }
                                , gameTipConfig = new GameTipConfig {
                                    isEnabled = true, style = 2,
                                }
                                , guiAnnouncementsConfig = new GUIAnnouncementsConfig {
                                    isEnabled = false, bannerColor = "Grey", textColor = "White", apiAdjustVPosition = 0.03f
                                }
                                , notifyPluginConfig = new NotifyPluginConfig {
                                    isEnabled = false, type = 0
                                }
                                ,
                            }
                        }
                        ;
                    }
                }
                _config.version = Version;
            }
            UpdateLootTables();
            SaveConfig();
        }
        bool IsFrontierMap() {
            return BaseNetworkable.serverEntities.OfType<RANDSwitch>().Any(x => x != null && x.transform != null && x.transform.position.x + x.transform.position.y + x.transform.position.z == 557);
        }
        void UpdateLootTables() {
            foreach (CrateConfig crateConfig in _config.crateConfigs) UpdateBaseLootTable(crateConfig.lootTableConfig);
        }
        void UpdateBaseLootTable(BaseLootTableConfig baseLootTableConfig) {
            for (int i = 0; i < baseLootTableConfig.randomItemsConfig.items.Count; i++) {
                LootItemConfig lootItemConfig = baseLootTableConfig.randomItemsConfig.items[i];
                if (lootItemConfig.chance <= 0) baseLootTableConfig.randomItemsConfig.items.RemoveAt(i);
            }
            baseLootTableConfig.randomItemsConfig.items = baseLootTableConfig.randomItemsConfig.items.OrderByQuickSort(x => x.chance);
            if (baseLootTableConfig.randomItemsConfig.maxItemsAmount > baseLootTableConfig.randomItemsConfig.items.Count) baseLootTableConfig.randomItemsConfig.maxItemsAmount = baseLootTableConfig.randomItemsConfig.items.Count;
            if (baseLootTableConfig.randomItemsConfig.minItemsAmount > baseLootTableConfig.randomItemsConfig.maxItemsAmount) baseLootTableConfig.randomItemsConfig.minItemsAmount = baseLootTableConfig.randomItemsConfig.maxItemsAmount;
        }
        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 Methods
#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;
                }
                PathManager.GenerateNewPath();
                if (PathManager.currentPath == null) 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));
                DelayStartEvent(true);
            }
            static IEnumerator DelayedStartEventCorountine(EventConfig eventConfig) {
                if (ins._config.mainConfig.preStartTime > 0) NotifyManager.SendMessageToAll("PreStart", ins._config.notifyConfig.prefix, ins._config.mainConfig.preStartTime);
                yield return CoroutineEx.waitForSeconds(ins._config.mainConfig.preStartTime);
                if (PathManager.currentPath != null) StartEvent(eventConfig);
                else StopEvent();
            }
            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("OnCaravanStart");
            }
            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);
            }
            internal static void StopEvent(bool isPluginUnloading = false) {
                if (IsEventActive()) {
                    ins.Unsubscribes();
                    ins.eventController.DeleteController();
                    Horseman.KillAllHorseman();
                    HorseCarriage.KillAllCarriages();
                    CaravanNpc.KillAllNpcs();
                    AirBalloon.KillAllBalloons();
                    HorseBrain.ClearData();
                    ZoneController.TryDeleteZone();
                    EventMapMarker.DeleteMapMarker();
                    NpcSpawnManager.ClearData();
                    PveModeManager.OnEventEnd();
                    GuiManager.DestroyAllGui();
                    LootManager.ClearLootData();
                    EconomyManager.OnEventEnd();
                    NotifyManager.SendMessageToAll("Finish", ins._config.notifyConfig.prefix);
                    Interface.CallHook("OnCaravanStop");
                    if (ins._config.mainConfig.enableStartStopLogs) NotifyManager.PrintLogMessage("EventStop_Log");
                    if (!isPluginUnloading) AutoStartEvent();
                }
                if (delayedEventStartCorountine != null) {
                    ServerMgr.Instance.StopCoroutine(delayedEventStartCorountine);
                    delayedEventStartCorountine = null;
                }
            }
        }
        class EventController : FacepunchBehaviour {
            internal EventConfig eventConfig;
            Coroutine spawnCorountine;
            Coroutine eventCorountine;
            internal List<CaravanHorse> caravanHorses = new List<CaravanHorse>();
            int eventTime;
            int stopTime;
            int agressiveTime;
            bool isEventLooted;
            internal int GetEventTime() {
                return eventTime;
            }
            internal Vector3 GetEventPosition() {
                int counter = 0;
                Vector3 resultPositon = Vector3.zero;
                foreach (CaravanHorse caravanHorse in caravanHorses) {
                    if (caravanHorse != null && caravanHorse.ridableHorse.IsExists()) {
                        resultPositon += caravanHorse.transform.position;
                        counter++;
                    }
                }
                return resultPositon / counter;
            }
            internal int GetEventGuardsCount() {
                int result = 0;
                foreach (CaravanHorse caravanHorse in caravanHorses) {
                    if (caravanHorse != null) {
                        HorseBrain horseBrain = caravanHorse.GetBrain();
                        if (horseBrain != null) result += horseBrain.GetGuardNpcCount();
                    }
                }
                return result;
            }
            internal bool IsCaravanAgressive() {
                return ins._config.behaviorConfig.agressiveTime < 0 || agressiveTime > 0;
            }
            internal bool IsStopped() {
                return stopTime > 0 || isEventLooted;
            }
            internal bool IsCaravanLooted() {
                return isEventLooted;
            }
            internal bool IsPlayerCanDealDamage(BasePlayer player, BaseEntity caravanEntity, bool shoudSendMessages) {
                if (spawnCorountine != null) return false;
                if (eventConfig.maxGroundDamageDistance > 0) {
                    Vector3 playerGroundPosition = new Vector3(player.transform.position.x, 0, player.transform.position.z);
                    Vector3 entityGroundPosition = new Vector3(caravanEntity.transform.position.x, 0, caravanEntity.transform.position.z);
                    float distance = Vector3.Distance(playerGroundPosition, entityGroundPosition);
                    float distanceMultiplicator = 1;
                    if (caravanEntity is HotAirBalloon) distanceMultiplicator = 1.5f;
                    else {
                        BaseEntity parentEntity = caravanEntity.GetParentEntity();
                        if (parentEntity != null && parentEntity is HotAirBalloon) distanceMultiplicator = 1.5f;
                    }
                    if (distance > eventConfig.maxGroundDamageDistance * distanceMultiplicator) {
                        if (shoudSendMessages) NotifyManager.SendMessageToPlayer(player, "DamageDistance", ins._config.notifyConfig.prefix);
                        return false;
                    }
                }
                if (PveModeManager.IsPveModeBlockInterract(player)) {
                    NotifyManager.SendMessageToPlayer(player, "PveMode_BlockAction", ins._config.notifyConfig.prefix);
                    return false;
                }
                return true;
            }
            internal bool IsPlayerCanLootCaravan(BasePlayer player, bool shoudSendMessages) {
                if (IsLootBlockedByThisPlugin()) {
                    NotifyManager.SendMessageToPlayer(player, "CantLoot", ins._config.notifyConfig.prefix);
                    return false;
                }
                if (PveModeManager.IsPveModeBlockInterract(player)) {
                    if (shoudSendMessages) NotifyManager.SendMessageToPlayer(player, "PveMode_BlockAction", ins._config.notifyConfig.prefix);
                    return false;
                }
                if (PveModeManager.IsPveModeBlockLooting(player)) {
                    if (shoudSendMessages) NotifyManager.SendMessageToPlayer(player, "PveMode_YouAreNoOwner", ins._config.notifyConfig.prefix);
                    return false;
                }
                return true;
            }
            bool IsLootBlockedByThisPlugin() {
                if (spawnCorountine != null) return true;
                if (agressiveTime <= 0 && ins._config.behaviorConfig.agressiveTime > 0) return true;
                if (ins._config.lootConfig.blockLootingByMove && !IsStopped()) return true;
                if (ins._config.lootConfig.blockLootingByNpcs && GetEventGuardsCount() > 0) return true;
                return false;
            }
            internal bool IsPlayerCanStopEvent(BasePlayer player, bool shoudSendMessages) {
                if (PveModeManager.IsPveModeBlockInterract(player)) {
                    NotifyManager.SendMessageToPlayer(player, "PveMode_BlockAction", ins._config.notifyConfig.prefix);
                    return false;
                }
                return true;
            }
            internal void OnEventAttacked(BasePlayer player) {
                MakeCaravanAgressive();
                if (!IsPlayerCanStopEvent(player, true)) return;
                if ((agressiveTime <= 0 && ins._config.behaviorConfig.agressiveTime > 0) || stopTime <= 0) NotifyManager.SendMessageToAll("CaravanAttacked", ins._config.notifyConfig.prefix, player.displayName, eventConfig.displayName.ToLower());
                StopMoving(player);
            }
            internal void MakeCaravanAgressive() {
                agressiveTime = ins._config.behaviorConfig.agressiveTime;
            }
            internal void EventPassingCheck() {
                if (isEventLooted) return;
                LootManager.UpdateCountOfUnlootedCrates();
                int countOfUnlootedCrates = LootManager.GetCountOfUnlootedCrates();
                if (countOfUnlootedCrates == 0) {
                    isEventLooted = true;
                    StopMoving(null);
                    if (eventTime > ins._config.mainConfig.endAfterDeathTime) eventTime = ins._config.mainConfig.endAfterDeathTime;
                    NotifyManager.SendMessageToAll("Looted", ins._config.notifyConfig.prefix, eventConfig.displayName);
                }
            }
            internal void OnCaravanRotated() {
                foreach (CaravanHorse caravanHorse in caravanHorses) {
                    if (caravanHorse == null) continue;
                    HorseBrain horseBrain = caravanHorse.GetBrain();
                    if (horseBrain == null) continue;
                    horseBrain.OnCaravanRotated();
                }
                CaravanNpc.OnCaravanRotated();
            }
            internal void Init(EventConfig eventConfig) {
                this.eventConfig = eventConfig;
                ins.Subscribes();
                SpawnCaravan();
            }
            void SpawnCaravan() {
                spawnCorountine = ServerMgr.Instance.StartCoroutine(SpawnCorountine());
            }
            IEnumerator SpawnCorountine() {
                PathPoint startPathPoint = PathManager.currentPath.startPathPoint;
                CaravanHorse lastCaravanHorse = null;
                foreach (CaravanVehicleConfig caravanVehicleConfig in eventConfig.vehicleOrder) {
                    while (lastCaravanHorse != null && Vector3.Distance(lastCaravanHorse.transform.position, startPathPoint.position) < 15) yield return CoroutineEx.waitForSeconds(1);
                    CaravanHorse caravanHorse = SpawnCaravanVehicle(caravanVehicleConfig);
                    if (caravanHorse != null) {
                        lastCaravanHorse = caravanHorse;
                        caravanHorses.Add(caravanHorse);
                    }
                    yield return CoroutineEx.waitForSeconds(1);
                }
                OnSpawnFinished();
            }
            CaravanHorse SpawnCaravanVehicle(CaravanVehicleConfig caravanVehicleConfig) {
                CarriageConfig horseCarriageConfig = ins._config.carriageConfigs.FirstOrDefault(x => x.presetName == caravanVehicleConfig.presetName);
                if (horseCarriageConfig != null) return HorseCarriage.CreateRouteCarriage(horseCarriageConfig, caravanVehicleConfig);
                return null;
            }
            void OnSpawnFinished() {
                PathPoint startPathPoint = PathManager.currentPath.startPathPoint;
                NotifyManager.SendMessage
// ... [Code preview truncated due to length. Full source in attached file] ...

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