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

FREE BackPumpJack : 1.4.33 1.4.33

Нет прав для скачивания
C#:
// Все права принадлежат дискорд сообществу https://discord.gg/VgNHPpNrz6
using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Facepunch;
using Newtonsoft.Json;
using Oxide.Core;
using Oxide.Core.Libraries.Covalence;
using Oxide.Core.Plugins;
using Rust;
using UnityEngine;
using UnityEngine.Networking;
using Random = UnityEngine.Random;

namespace Oxide.Plugins
{
    [Info("Back Pump Jack", "Arainrr/Lorenzo", "1.4.33")]
    [Description("Allows players to use survey charges to create oil/mining crater")]
    public class BackPumpJack : CovalencePlugin
    {
        #region Fields

        [PluginReference] private Plugin Friends;
        [PluginReference] private Plugin Clans;
        [PluginReference] private Plugin Notify;

        private static BackPumpJack _instance;
        private static DiscordComponent _discord = null;

        private const string TraceFile = "Trace";     // file name in log directory

        private const uint FuelStoragePumpID = 4260630588;
        private const uint OutputHopperPumpID = 70163214;

        private const uint FuelStorageQuarryID = 362963830;
        private const uint OutputHopperQuarryID = 875142383;

        private const string PREFAB_CRATER_OIL = "assets/prefabs/tools/surveycharge/survey_crater_oil.prefab";

        private readonly HashSet<ulong> _checkedCraters = new HashSet<ulong>();
        private readonly List<QuarryData> _activeCraters = new List<QuarryData>();
        private readonly List<MiningQuarry> _miningQuarries = new List<MiningQuarry>();
        private readonly Dictionary<ulong, PermissionSettings> _activeSurveyCharges = new Dictionary<ulong, PermissionSettings>();

        private int QuarryDefaultDieselStack = 0;
        private int QuarryDefaultFuelCapacity = 6;
        private int QuarryDefaultHopperSlots = 18;

        private int PumpDefaultDieselStack = 0;
        private int PumpDefaultFuelCapacity = 6;
        private int PumpDefaultHopperSlots = 18;

        public Timer refilltimer = null;
        private readonly float PlayerRadius = 12f;
        private readonly float MatchRadius = 1.5f;

#if CARBON
        const char Platform = 'C';
#else
        const char Platform = 'O';
#endif

        struct QuarryRates
        {
            public float processRate;
            public float workToAdd;
            public float workPerFuel;
        }

        QuarryRates miningQuarryBackup;
        QuarryRates pumpjackbackup;

        #endregion Fields

        #region Oxide Hooks

        private void Init()
        {
            MiningQuarry staticQuarry;
            MiningQuarry miningQuarry;
            MiningQuarry staticpumpjack;
            MiningQuarry pumpjack;

            StorageContainer fuelstorage;
            StorageContainer hopper;
            _instance = this;

            LoadData();
            foreach (var permissionSetting in _configData.Permissions)
            {
                if (!permission.PermissionExists(permissionSetting.Permission, this))
                {
                    permission.RegisterPermission(permissionSetting.Permission, this);
                }
            }

            staticQuarry = GameManager.server.FindPrefab("assets/bundled/prefabs/static/miningquarry_static.prefab")?.GetComponent<MiningQuarry>();
            miningQuarry = GameManager.server.FindPrefab("assets/prefabs/deployable/quarry/mining_quarry.prefab")?.GetComponent<MiningQuarry>();
            staticpumpjack = GameManager.server.FindPrefab("assets/bundled/prefabs/static/pumpjack-static.prefab")?.GetComponent<MiningQuarry>();
            pumpjack = GameManager.server.FindPrefab("assets/prefabs/deployable/oil jack/mining.pumpjack.prefab")?.GetComponent<MiningQuarry>();

            if (_configData.ApplyPatchForMiningRates)
            {
                miningQuarryBackup.processRate = miningQuarry.processRate;
                miningQuarryBackup.workToAdd = miningQuarry.workToAdd;
                miningQuarryBackup.workPerFuel = miningQuarry.workPerFuel;

                miningQuarry.processRate = staticQuarry.processRate;
                miningQuarry.workToAdd = staticQuarry.workToAdd;
                miningQuarry.workPerFuel = staticQuarry.workPerFuel;

                pumpjackbackup.processRate = pumpjack.processRate;
                pumpjackbackup.workToAdd = pumpjack.workToAdd;
                pumpjackbackup.workPerFuel = pumpjack.workPerFuel;

                pumpjack.processRate = staticpumpjack.processRate;
                pumpjack.workToAdd = staticpumpjack.workToAdd;
                pumpjack.workPerFuel = staticpumpjack.workPerFuel;
            }

            if (staticQuarry != null)
            {
                fuelstorage = staticQuarry?.fuelStoragePrefab.prefabToSpawn.GetEntity() as StorageContainer;
                QuarryDefaultDieselStack = fuelstorage?.maxStackSize ?? 0;
                QuarryDefaultFuelCapacity = fuelstorage?.inventorySlots ?? 6;

                hopper = staticQuarry.hopperPrefab.prefabToSpawn.GetEntity() as StorageContainer;
                QuarryDefaultHopperSlots = hopper?.inventorySlots ?? 18;
            }

            if (staticpumpjack != null)
            {
                fuelstorage = staticpumpjack.fuelStoragePrefab.prefabToSpawn.GetEntity() as StorageContainer;
                PumpDefaultDieselStack = fuelstorage?.maxStackSize ?? 0;
                PumpDefaultFuelCapacity = fuelstorage?.inventorySlots ?? 6;

                hopper = staticpumpjack.hopperPrefab.prefabToSpawn.GetEntity() as StorageContainer;
                PumpDefaultHopperSlots = hopper?.inventorySlots ?? 18;
            }


            Unsubscribe(nameof(CanBuild));
            Unsubscribe(nameof(OnEntityTakeDamage));
            Unsubscribe(nameof(OnEntitySpawned));
            Unsubscribe(nameof(OnEntityKill));
        }

        private void Unload()
        {
            foreach (var serverEntity in BaseNetworkable.serverEntities)
            {
                if (serverEntity is MiningQuarry miningQuarry)
                {

                    if (miningQuarry.ShortPrefabName == "mining_quarry")
                    {
                        // restore default value
                        try
                        {
                            var fuelstorage = miningQuarry.fuelStoragePrefab.instance.GetComponent<StorageContainer>();
                            if (_configData.DieselFuelMaxStackSize >= 0) fuelstorage.inventory.maxStackSize = QuarryDefaultDieselStack;
                            if (_configData.FuelSlots > 0) fuelstorage.inventory.capacity = QuarryDefaultFuelCapacity;
                        }
                        catch (Exception ex)
                        {
                            PrintError(ex.Message);
                            PrintError($"Quarry at location {miningQuarry.transform.position} is missing fuel storage container.");
                            miningQuarry.fuelStoragePrefab?.DoSpawn(miningQuarry);
                        }

                        // restore default value
                        try {
                            var hopper = miningQuarry.hopperPrefab.instance.GetComponent<StorageContainer>();
                            if (_configData.HopperSlots > 0) hopper.inventory.capacity = QuarryDefaultHopperSlots;
                        }
                        catch (Exception ex)
                        {
                            PrintError(ex.Message);
                            PrintError($"Quarry at location {miningQuarry.transform.position} is missing hopper storage container.");
                            miningQuarry.hopperPrefab?.DoSpawn(miningQuarry);
                        }
                    }

                    if (miningQuarry.ShortPrefabName == "mining.pumpjack")
                    {
                        try {
                            // restore default value
                            var fuelstorage = miningQuarry.fuelStoragePrefab.instance.GetComponent<StorageContainer>();
                            if (_configData.DieselFuelMaxStackSize >= 0) fuelstorage.inventory.maxStackSize = PumpDefaultDieselStack;
                            if (_configData.FuelSlots > 0) fuelstorage.inventory.capacity = PumpDefaultFuelCapacity;
                        }
                        catch (Exception ex)
                        {
                            PrintError(ex.Message);
                            PrintError($"Quarry at location {miningQuarry.transform.position} is missing fuel storage container.");
                            miningQuarry.fuelStoragePrefab?.DoSpawn(miningQuarry);
                        }

                        // restore default value
                        try {
                            var hopper = miningQuarry.hopperPrefab.instance.GetComponent<StorageContainer>();
                            if (_configData.HopperSlots > 0) hopper.inventory.capacity = PumpDefaultHopperSlots;
                        }
                        catch (Exception ex)
                        {
                            PrintError(ex.Message);
                            PrintError($"Quarry at location {miningQuarry.transform.position} is missing hopper storage container.");
                            miningQuarry.hopperPrefab?.DoSpawn(miningQuarry);
                        }
                    }

                    if (miningQuarry.ShortPrefabName == "mining_quarry" || miningQuarry.ShortPrefabName == "mining.pumpjack")
                    {
                        if (_configData.TimePerBarrel > 0) miningQuarry.workPerFuel = 1000f;
                        if (miningQuarry.pendingWork > miningQuarry.workPerFuel) miningQuarry.pendingWork = miningQuarry.workPerFuel;
                    }

                    if (miningQuarry.isStatic)
                    {
                        miningQuarry.UpdateStaticDeposit();
                    }

                    QuarryStateDetector quarrydetector = miningQuarry.gameObject.GetComponent<QuarryStateDetector>();
                    // When server shutdown, onDestroy member never execute with Destroy(obj) 
                    // use DestroyImmediate instead to avoid execution delay
                    if (quarrydetector != null) UnityEngine.Object.DestroyImmediate(quarrydetector);

                }
            }

            if (_configData.ApplyPatchForMiningRates)
            {
                var miningQuarry = GameManager.server.FindPrefab("assets/prefabs/deployable/quarry/mining_quarry.prefab")?.GetComponent<MiningQuarry>();
                if (miningQuarry != null)
                {
                    miningQuarry.processRate = miningQuarryBackup.processRate;
                    miningQuarry.workToAdd = miningQuarryBackup.workToAdd;
                    miningQuarry.workPerFuel = miningQuarryBackup.workPerFuel;
                }
                var pumpjack = GameManager.server.FindPrefab("assets/prefabs/deployable/oil jack/mining.pumpjack.prefab")?.GetComponent<MiningQuarry>();
                if (pumpjack != null)
                {
                    pumpjack.processRate = pumpjackbackup.processRate;
                    pumpjack.workToAdd = pumpjackbackup.workToAdd;
                    pumpjack.workPerFuel = pumpjackbackup.workPerFuel;
                }
            }

            if (refilltimer != null) refilltimer.Destroy();

            SaveData();
            _instance = null;
            _discord = null;
        }

        private void OnServerInitialized(bool initial)
        {
            
            // setup discord info
            if (_configData.Global.Discordena && !string.IsNullOrEmpty(_configData.Global.DiscordHookUrl))
            {
                var loader = new GameObject("WebObject");
                _discord = loader.AddComponent<DiscordComponent>().Configure(_configData.Global.DiscordHookUrl);
            }
            PrintToLog($"Plugin BackPumpJack restarted");

            if (_configData.Global.CantDeploy)
            {
                Subscribe(nameof(CanBuild));
            }
            if (_configData.Global.CantDamage)
            {
                Subscribe(nameof(OnEntityTakeDamage));
            }

            AddCovalenceCommand(_configData.CommandRefill, nameof(CCmdRefresh));
            AddCovalenceCommand(_configData.CommandInfo, nameof(CCmdInfo));
            AddCovalenceCommand(_configData.CommandResetDeposits, nameof(CCmdResetDeposit));            

            var quarry = GameManager.server.FindPrefab("assets/prefabs/deployable/quarry/mining_quarry.prefab")?.GetComponent<MiningQuarry>();
            if (quarry != null)
            {
                QuarrySettings.WorkPerMinute = 60f / quarry.processRate * quarry.workToAdd;
            }
            var pumpjack = GameManager.server.FindPrefab("assets/prefabs/deployable/oil jack/mining.pumpjack.prefab")?.GetComponent<MiningQuarry>();
            if (pumpjack != null)
            {
                PumpJackSettings.WorkPerMinute = 60f / pumpjack.processRate * pumpjack.workToAdd;
            }

            if (_configData.Global.UseFriends && !IspluginLoaded(Friends))
            {
                PrintWarning("Optional Friend plugin not found.Friend disabled");
            }

            if (_configData.Global.UseClans && !IspluginLoaded(Clans))
            {
                PrintWarning("Optional Clans plugin not found.Clans disabled");
            }

            if (_configData.Global.useNotify && !IspluginLoaded(Notify))
            {
                PrintWarning("Optional Notify plugin not found.Notify disabled");
            }

            int CraterCount = 0;
            int QuaryCount = 0;
            timer.Once(2f, () =>
            {
                Subscribe(nameof(OnEntitySpawned));
                Subscribe(nameof(OnEntityKill));

                foreach (var serverEntity in BaseNetworkable.serverEntities)
                {
                    if (serverEntity is SurveyCrater surveyCrater)
                    {
                        CraterCount++;

                        var deposit = ResourceDepositManager.GetOrCreate(surveyCrater.transform.position);
                        if (deposit?._resources == null || deposit._resources.Count <= 0)
                        {
                            continue;
                        }
                        var mineralItems = deposit._resources.Select(depositEntry => new MineralItemData
                        {
                            amount = depositEntry.amount,
                            shortname = depositEntry.type.shortname,
                            workNeeded = depositEntry.workNeeded
                        }).ToList();
                        _activeCraters.Add(new QuarryData
                        {
                            position = surveyCrater.transform.position,
                            isLiquid = surveyCrater.ShortPrefabName == "survey_crater_oil",
                            mineralItems = mineralItems
                        });
                        continue;
                    }

                    if ((serverEntity is MiningQuarry miningQuarry) && !miningQuarry.IsDestroyed)
                    {

                        QuaryCount++;
                        OnEntitySpawned(miningQuarry);
                    }
                }

                CheckValidData();
            });
        }

        private void OnServerSave()
        {
            refilltimer = timer.Once(Random.Range(0f, 10f), () => { RefillMiningQuarries(); SaveData(); }); 
        }

        public readonly string[] QuarryTypeLookup = { "Oil", "Stone", "Sulfur", "HQM" };

        private void OnEntitySpawned(MiningQuarry miningQuarry)
        {
            if (miningQuarry == null) return;
            
            if ((miningQuarry.ShortPrefabName == "miningquarry_static" || miningQuarry.ShortPrefabName == "pumpjack-static") && !miningQuarry.OwnerID.IsSteamId())
            {
                if (_configData.StaticQuarryModifier)
                {
                    var type = QuarryTypeLookup[(int)miningQuarry.staticType];
                    StaticQuarrySettings QuarrySetting;
                    bool isLiquid = (miningQuarry.staticType == MiningQuarry.QuarryType.None);

                    float WorkPerMinute = miningQuarry.workToAdd * (60.0f / miningQuarry.processRate);
                    if (_configData.StaticQuarryType.TryGetValue(type, out QuarrySetting))
                    {
                        miningQuarry._linkedDeposit._resources.Clear();

                        QuarrySetting.RefillResourceDeposit(miningQuarry._linkedDeposit, WorkPerMinute, isLiquid);
                    }
                    else PrintWarning($"Missing resource definition of static quarry, from config file ({type})");
                }
                return;
            }

            _miningQuarries.Add(miningQuarry);
            UpdateAndRefill(miningQuarry);

            PrintToLog($"Resources for new mining quarry at {PositionToString(miningQuarry.transform.position)} / ({miningQuarry.transform.position}) : {getDepositInfo(miningQuarry._linkedDeposit)}");

            if (_configData.PatchLadder || _configData.PatchLightSignal)
            {
                QuarryStateDetector quarrydetector = miningQuarry.gameObject.GetComponent<QuarryStateDetector>();
                if (quarrydetector == null) miningQuarry.gameObject.AddComponent<QuarryStateDetector>();
            }

            try
            {
                var fuelstorage = miningQuarry.fuelStoragePrefab.instance.GetComponent<StorageContainer>();
                if (_configData.DieselFuelMaxStackSize >= 0) fuelstorage.inventory.maxStackSize = _configData.DieselFuelMaxStackSize;
                if (_configData.FuelSlots > 0) fuelstorage.inventory.capacity = _configData.FuelSlots;
            }
            catch (Exception ex)
            {
                PrintError(ex.Message);
                PrintError($"Quarry at location {miningQuarry.transform.position} is missing fuel storage container.");
                miningQuarry.fuelStoragePrefab?.DoSpawn(miningQuarry);
            }

            try
            {
                var hopper = miningQuarry.hopperPrefab.instance.GetComponent<StorageContainer>();
                if (_configData.HopperSlots > 0) hopper.inventory.capacity = _configData.HopperSlots;
            }
            catch (Exception ex)
            {
                PrintError(ex.Message);
                PrintError($"Quarry at location {miningQuarry.transform.position} is missing hopper storage container.");
                miningQuarry.hopperPrefab?.DoSpawn(miningQuarry);
            }

            if (_configData.TimePerBarrel > 0.0f)
            {
                miningQuarry.workPerFuel = miningQuarry.workToAdd / miningQuarry.processRate * (float)_configData.TimePerBarrel;
            }
            if (miningQuarry.pendingWork > miningQuarry.workPerFuel) miningQuarry.pendingWork = miningQuarry.workPerFuel;
        }

        private bool UpdateAndRefill(MiningQuarry miningQuarry)
        {
            float minDistance = Math.Max(MatchRadius, _configData.ResourceDepositCheckRadius);
            QuarryData foundQuarryData = null;
            // scan stored data if entry exist
            foreach (var quarryData in _storedData.quarryDataList)
            {
                if (quarryData == null) continue;                
                var distance = Vector3Ex.Distance2D(quarryData.position, miningQuarry.transform.position);
                if (distance < minDistance)
                {
                    minDistance = distance;
                    foundQuarryData = quarryData;
                }
            }

            if (foundQuarryData == null)
            {
                // scan activecraters if entry exist
                foreach (var quarryData in _activeCraters)
                {
                    var distance = Vector3Ex.Distance2D(quarryData.position, miningQuarry.transform.position);
                    if (distance < minDistance)
                    {
                        minDistance = distance;
                        foundQuarryData = quarryData;
                    }
                }
                if (foundQuarryData != null)
                {
                    foundQuarryData.position = miningQuarry.transform.position;
                    _storedData.quarryDataList.Add(foundQuarryData);
                }
            }

            if (foundQuarryData != null)
            {
                CreateResourceDeposit(miningQuarry, foundQuarryData);
            }
            else
            {
                var permissionSetting = GetPermissionSetting(miningQuarry.OwnerID.ToString());
                if (permissionSetting == null) permissionSetting = _configData.Permissions[0];

                List<MineralItemData> mineralItems;
                miningQuarry._linkedDeposit._resources.Clear();
                if (miningQuarry.ShortPrefabName == "mining_quarry") mineralItems = permissionSetting.Quarry.RefillResourceDeposit(miningQuarry._linkedDeposit);
                else mineralItems = permissionSetting.PumpJack.RefillResourceDeposit(miningQuarry._linkedDeposit);

                if (mineralItems.Count == 0) PrintToLog("Deposit contain no mineral items !");
                else
                {
                    _storedData.quarryDataList.Add(new QuarryData
                    {
                        position = miningQuarry.transform.position,
                        isLiquid = miningQuarry._linkedDeposit._resources[0].isLiquid,
                        mineralItems = mineralItems
                    });
                }

                StringBuilder log = Pool.Get<StringBuilder>();
                log.AppendFormat("New deposit info for quarry at {0} ({1}), will be added to datafile\n{2}", 
                    PositionToString(miningQuarry.transform.position), miningQuarry.transform.position, getDepositInfo(miningQuarry._linkedDeposit));
                PrintToLog(log.ToString());
                Pool.FreeUnmanaged(ref log);
            }
            return (foundQuarryData != null);
        }

        private void OnEntityKill(MiningQuarry miningQuarry)
        {
            if (miningQuarry == null) return;

            if (miningQuarry.ShortPrefabName == "mining_quarry" || miningQuarry.ShortPrefabName == "mining.pumpjack")
            {
                _miningQuarries.Remove(miningQuarry);

                QuarryStateDetector quarrydetector = miningQuarry.gameObject.GetComponent<QuarryStateDetector>();
                if (quarrydetector != null) UnityEngine.Object.Destroy(quarrydetector);

                // cleanup datafile when quarry are removed
                CheckValidData();
                PrintToLog($"Mining Quarry was removed at location {PositionToString(miningQuarry.transform.position)} / ({miningQuarry.transform.position})");
            }
        }

        private void OnExplosiveThrown(BasePlayer player, SurveyCharge surveyCharge)
        {
            if (surveyCharge == null || surveyCharge.net == null) return;
            
            var permissionSetting = GetPermissionSetting(player.UserIDString);
            if (permissionSetting == null) return;
            surveyCharge.OwnerID = (ulong)player.userID;
            _activeSurveyCharges.Add(surveyCharge.net.ID.Value, permissionSetting);
        }

        private void OnEntityKill(SurveyCharge surveyCharge)
        {
            if (surveyCharge == null || surveyCharge.net == null) return;
            PrintToLog($"Survey charge at {PositionToString(surveyCharge.transform.position)} / ({surveyCharge.transform.position})");

            PermissionSettings permissionSettings;
            if (_activeSurveyCharges.TryGetValue(surveyCharge.net.ID.Value, out permissionSettings))
            {
                _activeSurveyCharges.Remove(surveyCharge.net.ID.Value);
                QuarryData craterinfo = findInactiveCraterData(surveyCharge);
                var position = surveyCharge.transform.position;
                var ownerId = surveyCharge.OwnerID;
                NextTick(() =>
                {
                    if (craterinfo == null) craterinfo = ModifyResourceDeposit(permissionSettings, position, ownerId);
                    else CopyResourceDepositInfo(permissionSettings, position, ownerId, craterinfo);
                    if (craterinfo != null) PrintToLog($"Resource deposit at {PositionToString(craterinfo.position)} / ({craterinfo.position}) : {getDepositInfo(craterinfo)}");
                });
            }
        }

        //private void OnEntitySpawned(SurveyCrater crater)
        //{
        //    if (crater == null || crater.net == null) return;
        //}

        private void OnEntityKill(SurveyCrater crater)
        {
            if (crater == null || crater.net == null) return;
            if (!_checkedCraters.Remove(crater.net?.ID.Value ?? 0))
                PrintWarning("OnEntityKill SurveyCrater not found");
        }

        private object OnEntityTakeDamage(SurveyCrater surveyCrater, HitInfo info)
        {
            if (surveyCrater == null || !surveyCrater.OwnerID.IsSteamId())
            {
                return null;
            }
            var player = info?.InitiatorPlayer;
            if (player == null || !player.userID.IsSteamId())
            {
                return true;
            }
            if (!AreFriends((ulong)player.userID, surveyCrater.OwnerID))
            {
                return true;
            }
            return null;
        }

        private object OnEntityTakeDamage(StorageContainer storage, HitInfo info)
        {
            if (storage?.GetParentEntity() is MiningQuarry)
            {
                var ShortPrefabName = (storage?.GetParentEntity() as MiningQuarry).ShortPrefabName;
                if (ShortPrefabName == "mining_quarry" || ShortPrefabName == "mining.pumpjack")
                    return true; // ignore damage on storage from mining quarry
            }
            return null;
        }

        private object CanBuild(Planner planner, Construction prefab, Construction.Target target)
        {
            if (planner == null)
            {
                return null;
            }
            var surveyCrater = target.entity as SurveyCrater;
            if (surveyCrater == null || !surveyCrater.OwnerID.IsSteamId())
            {
                return null;
            }
            var player = planner.GetOwnerPlayer();
            if (player == null)
            {
                return null;
            }
            if (!AreFriends((ulong)player.userID, surveyCrater.OwnerID))
            {
                SendChatMessage(player, "NoDeploy", player.UserIDString);
                return true;
            }
            return null;
        }

        private void CanLootEntity(BasePlayer player, StorageContainer container)
        {
            if (player == null || container == null) return;

            if (container.prefabID == OutputHopperPumpID ||
                container.prefabID == OutputHopperQuarryID)  LootQuarryOutput(player, container);
            return;
        }

        void OnLootEntityEnd(BasePlayer player, StorageContainer container)
        {
            if (container.prefabID == FuelStoragePumpID ||
                container.prefabID == FuelStorageQuarryID) LootDieselEngineEnd(player, container);   // fuelstorage for quarry or pumpjack
        }

        void LootQuarryOutput(BasePlayer player, StorageContainer container)
        {
            int hoppercnt = container.inventory.TotalItemAmount();
            PrintToLog($"Player {player.displayName}/{(ulong)player.userID} looting quarry [{PositionToString(container.transform.position)}], {ReportInventory(container)} items in hopper");
            return;
        }

        void LootDieselEngineEnd(BasePlayer player, StorageContainer fueltank)
        {
            var amount = fueltank.inventory.GetAmount(1568388703, true);    // lowgradefuel == -946369541, Diesel == 1568388703
            PrintToLog($"Player {player.displayName}/{(ulong)player.userID} looting fuel in engine at [{PositionToString(fueltank.transform.position)}],  {amount} diesel");
        }


        #endregion Oxide Hooks

        #region Methods

        private int RefillMiningQuarries(bool AddMissing = false)
        {
            var count = 0;
            foreach (var miningQuarry in _miningQuarries)
            {
                if ((miningQuarry == null || miningQuarry.IsDestroyed)) continue;


                if (UpdateAndRefill(miningQuarry)) count++;
            }
            return count;
        }

        private void CheckValidData()
        {
            int removals = 0;
            float minDistance = Math.Max(MatchRadius, _configData.ResourceDepositCheckRadius);
            List<MiningQuarry> quarryList = Pool.Get<List<MiningQuarry>>();

            for (int i = _storedData.quarryDataList.Count - 1; i >= 0; i--)
            {
                bool validData = false;
                quarryList.Clear();
				// Search radius must be >3 even if quarryData position exactly match miningQuarry position
				// don't use MatchRadius for Vis.Entities
                Vis.Entities(_storedData.quarryDataList[i].position, 5f, quarryList, Layers.Mask.Default);
                if (quarryList.Count == 0) PrintToLog($"CheckValidData, No quarry found matching _storedData at {_storedData.quarryDataList[i].position}");
                if (quarryList.Count > 1) PrintToLog($"CheckValidData, multiple quarry found matching _storedData at {_storedData.quarryDataList[i].position}");
                foreach (MiningQuarry miningQuarry in quarryList)
                {
                    if (miningQuarry == null || miningQuarry.IsDestroyed) continue;
                    if (Vector3Ex.Distance2D(_storedData.quarryDataList[i].position, miningQuarry.transform.position) < minDistance)
                    {
                        validData = true;
                        break;
                    }
                }
                if (!validData)
                {
                    _storedData.quarryDataList.RemoveAt(i);
                    removals++;
                }
            }
            if (removals != 0) PrintToLog($"CheckValidData: removing {removals} entrys,  quarrycount:{_miningQuarries.Count}");
            Pool.FreeUnmanaged(ref quarryList);
        }

        private static void CreateResourceDeposit(MiningQuarry miningQuarry, QuarryData quarryData)
        {
            if (quarryData.isLiquid) miningQuarry.canExtractLiquid = true;
            else miningQuarry.canExtractSolid = true;

            miningQuarry._linkedDeposit._resources.Clear();
            foreach (var mineralItem in quarryData.mineralItems)
            {
                var itemDefinition = ItemManager.FindItemDefinition(mineralItem.shortname);
                if (itemDefinition == null) continue;
                miningQuarry._linkedDeposit.Add(itemDefinition, 1f, mineralItem.amount, mineralItem.workNeeded, ResourceDepositManager.ResourceDeposit.surveySpawnType.ITEM, quarryData.isLiquid);
            }
            miningQuarry.SendNetworkUpdateImmediate();
        }

        private static void CreateResourceDeposit(ResourceDepositManager.ResourceDeposit deposit, QuarryData quarryData)
        {
            deposit._resources.Clear();
            foreach (var mineralItem in quarryData.mineralItems)
            {
                var itemDefinition = ItemManager.FindItemDefinition(mineralItem.shortname);
                if (itemDefinition == null) continue;               
                deposit.Add(itemDefinition, 1f, mineralItem.amount, mineralItem.workNeeded, ResourceDepositManager.ResourceDeposit.surveySpawnType.ITEM, quarryData.isLiquid);
            }
        }

        private QuarryData ModifyResourceDeposit(PermissionSettings permissionSettings, Vector3 checkPosition, ulong playerID)
        {
            QuarryData quarryData = null;
            var surveyCraterList = Pool.Get<List<SurveyCrater>>();
            Vis.Entities(checkPosition, 1f, surveyCraterList, Layers.Mask.Default);
            if (surveyCraterList.Count == 0) PrintToLog($"ModifyResourceDeposit, No survey crater found at {checkPosition}");
            if (surveyCraterList.Count > 1) PrintToLog($"More then one survey crater found at {checkPosition} ");
            foreach (var surveyCrater in surveyCraterList)
            {
                if (surveyCrater == null || surveyCrater.IsDestroyed) continue;
                if (_checkedCraters.Contains(surveyCrater.net?.ID.Value ?? 0)) continue;
                if (Random.Range(0f, 100f) < permissionSettings.OilCraterChance)
                {
                    // Set liquid resource
                    var oilCrater = GameManager.server.CreateEntity(PREFAB_CRATER_OIL, surveyCrater.transform.position) as SurveyCrater;
                    if (oilCrater == null) continue;
                    
                    surveyCrater.Kill();
                    oilCrater.Spawn();
                    _checkedCraters.Add(oilCrater.net?.ID.Value ?? 0);
                    
                    var deposit = ResourceDepositManager.GetOrCreate(oilCrater.transform.position);
                    if (deposit != null)
                    {
                        oilCrater.OwnerID = playerID;
                        deposit._resources.Clear();

                        var mineralItems = permissionSettings.PumpJack.RefillResourceDeposit(deposit);
                        _activeCraters.Add(quarryData = new QuarryData
                            {
                                position = oilCrater.transform.position,
                                isLiquid = permissionSettings.PumpJack.IsLiquid,
                                mineralItems = mineralItems
                            });
                    }
                    
                }
                else if (Random.Range(0f, 100f) < permissionSettings.Quarry.ModifyChance)
                {
                    // Set custom mineral resources
                    _checkedCraters.Add(surveyCrater.net?.ID.Value ?? 0);
                    var deposit = ResourceDepositManager.GetOrCreate(surveyCrater.transform.position);
                    if (deposit != null)
                    {
                        surveyCrater.OwnerID = playerID;
                        deposit._resources.Clear();

                        var mineralItems = permissionSettings.Quarry.RefillResourceDeposit(deposit);
                        _activeCraters.Add(quarryData = new QuarryData
                        {
                            position = surveyCrater.transform.position,
                            isLiquid = permissionSettings.Quarry.IsLiquid,
                            mineralItems = mineralItems
                        });
                    }

                }
                else
                {
                    // Default FP surveycrater resource
                    _checkedCraters.Add(surveyCrater.net?.ID.Value ?? 0);
                    var deposit = ResourceDepositManager.GetOrCreate(surveyCrater.transform.position);
                    if (deposit != null)
                    {
                        surveyCrater.OwnerID = playerID;

                        var mineralItems = deposit._resources.Select(depositEntry => new MineralItemData
                        {
                            amount = Random.Range(50000, 100000),
                            shortname = depositEntry.type.shortname,
                            workNeeded = depositEntry.workNeeded
                        }).ToList();

                        _activeCraters.Add(quarryData = new QuarryData
                        {
                            position = surveyCrater.transform.position,
                            isLiquid = deposit._resources[0].isLiquid,
                            mineralItems = mineralItems
                        });
                    }
                }
            }
            Pool.FreeUnmanaged(ref surveyCraterList);
            
            return quarryData;
        }

      
        private void CopyResourceDepositInfo(PermissionSettings permissionSettings, Vector3 checkPosition, ulong playerID, QuarryData crater)
        {
            var surveyCraterList = Pool.Get<List<SurveyCrater>>();
            Vis.Entities(checkPosition, 1f, surveyCraterList, Layers.Mask.Default);
            if (surveyCraterList.Count == 0) PrintToLog($"CopyResource, No survey crater found at {checkPosition}");
            if (surveyCraterList.Count > 1) PrintToLog("CopyResource, More then one survey crater found at one spot ");
            foreach (var surveyCrater in surveyCraterList)
            {
                if (surveyCrater == null || surveyCrater.IsDestroyed) continue;
                if (_checkedCraters.Contains(surveyCrater.net?.ID.Value ?? 0)) continue;
                SurveyCrater newsurveyCrater;

                if (crater.isLiquid)
                {
                    surveyCrater.Kill();
                    newsurveyCrater = GameManager.server.CreateEntity(PREFAB_CRATER_OIL, surveyCrater.transform.position) as SurveyCrater;
                    if (newsurveyCrater == null) continue;
                    newsurveyCrater.Spawn();
                }
                else newsurveyCrater = surveyCrater;

                _checkedCraters.Add(newsurveyCrater.net?.ID.Value ?? 0);
                    
                var deposit = ResourceDepositManager.GetOrCreate(newsurveyCrater.transform.position);
                if (deposit != null)
                {
                    newsurveyCrater.OwnerID = playerID;
                    deposit._resources.Clear();                    
                    CreateResourceDeposit(deposit, crater);
                }
                newsurveyCrater.SendNetworkUpdateImmediate();
            }
            
            Pool.FreeUnmanaged(ref surveyCraterList);
        }


        QuarryData findInactiveCraterData(SurveyCharge surveycharge)
        {
            float minDistance = Math.Max(MatchRadius, _configData.ResourceDepositCheckRadius);
            QuarryData targetcrater = null;
            foreach (var crater in _activeCraters)
            {
                var distance = Vector3Ex.Distance2D(crater.position, surveycharge.transform.position);
                if (distance < minDistance)
                {
                    minDistance = distance;
                    targetcrater = crater;                    
                }
            }

            if (targetcrater == null)
            {
                foreach (var crater in _storedData.quarryDataList)
                {
                    var distance = Vector3Ex.Distance2D(crater.position, surveycharge.transform.position);
                    if (distance < minDistance)
                    {
                        minDistance = distance;
                        targetcrater = crater;
                    }
                }
            }
            return targetcrater;
        }
        
        string ReportInventory(StorageContainer storage)
        {
            StringBuilder Report = Pool.Get<StringBuilder>();
            try
            {
                Report.Append(" [");
                int itemcount;
                int count = 0;
                foreach (var itemstr in _configData.ReportItems)
                {
                    Item item = storage.inventory.FindItemByItemName(itemstr);
                    if (item == null) continue;
                    itemcount = storage.inventory.GetTotalItemAmount(item, 0, storage.inventory.capacity - 1);
                    if (count != 0) Report.Append(", ");
                    Report.AppendFormat("{1} {0}", item.info.displayName.english, itemcount.ToString());
                    count++;
                }
                if (count == 0) Report.Append("Empty");
                Report.Append("]");
                return Report.ToString();
            }
            finally 
            { 
                Pool.FreeUnmanaged(ref Report);
            }
        }
        

        private PermissionSettings GetPermissionSetting(string UserIDString)
        {
            PermissionSettings permissionSettings = null;
            var priority = 0;
            foreach (var perm in _configData.Permissions)
            {
                if (perm.Priority >= priority && permission.UserHasPermission(UserIDString, perm.Permission))
                {
                    priority = perm.Priority;
                    permissionSettings = perm;
                }
            }
            return permissionSettings;
        }

        #region AreFriends

        private bool AreFriends(ulong playerID, ulong friendID)
        {
            if (playerID == friendID)
            {
                return true;
            }
            if (_configData.Global.UseTeams && SameTeam(playerID, friendID))
            {
                return true;
            }
            if (_configData.Global.UseFriends && HasFriend(playerID, friendID))
            {
                return true;
            }
            if (_configData.Global.UseClans && SameClan(playerID, friendID))
            {
                return true;
            }
            return false;
        }

        private bool HasFriend(ulong playerID, ulong friendID)
        {
            if (!IspluginLoaded(Friends))
            {
                return false;
            }
            return (bool)Friends.Call("HasFriend", playerID, friendID);
        }

        private bool SameTeam(ulong playerID, ulong friendID)
        {
            if (!RelationshipManager.TeamsEnabled())
            {
                return false;
            }
            var playerTeam = RelationshipManager.ServerInstance.FindPlayersTeam(playerID);
            if (playerTeam == null) return false;
            
            if (playerTeam.members.Contains(friendID)) return true;
            return false;
        }

        private bool SameClan(ulong playerID, ulong friendID)
        {
            if (IspluginLoaded(Clans))
            {
                //Clans
                var isMember = Clans.Call("IsClanMember", playerID.ToString(), friendID.ToString());
                if (isMember != null && (bool)isMember) return true;

                //Rust:IO Clans
                var playerClan = Clans.Call("GetClanOf", playerID);
                var friendClan = Clans.Call("GetClanOf", friendID);
                if (playerClan != null && friendClan != null && (string)playerClan == (string)friendClan) return true;
            }

            if (_configData.Global.UseClanTable == true)
            {
                long playerclan = BasePlayer.FindAwakeOrSleeping(playerID.ToString())?.clanId ?? 0;
                IClan clan = null;
                if (playerclan!=0 && (ClanManager.ServerInstance.Backend?.TryGet(playerclan, out clan) ?? false))
                {
                    foreach (ClanMember member in clan.Members)
                    {
                        if (member.SteamId == friendID) return true;
                    }
                }
            }

            return false;
        }

        #endregion AreFriends

        private bool IsAdmin(ulong id) => permission.UserHasPermission(id.ToString(), _configData.PermissionAdmin);

        bool IspluginLoaded(Plugin a) => (a?.IsLoaded ?? false);

        #endregion Methods

        string getDepositInfo(ResourceDepositManager.ResourceDeposit deposit)
        {
            StringBuilder log = Pool.Get<StringBuilder>();
            try
            {
                foreach (var res in deposit._resources)
                {
                    if (res.isLiquid) log.AppendFormat("\nResource: {0,-14}, Rate: {1,5:F2} pM", res.type.shortname, PumpJackSettings.WorkPerMinute / res.workNeeded);
                    else log.AppendFormat("\nResource: {0,-14}, Rate: {1,5:F2} pM", res.type.shortname, QuarrySettings.WorkPerMinute / res.workNeeded);
                }
                return (log.ToString());
            }
            finally
            { 
                Pool.FreeUnmanaged(ref log); 
            }
        }

        string getDepositInfo(QuarryData deposit)
        {
            StringBuilder log = Pool.Get<StringBuilder>();
            try
            {
                foreach (var res in deposit.mineralItems)
                {
                    if (deposit.isLiquid) log.AppendFormat("\nResource: {0,-14}, Rate: {1,5:F2} pM", res.shortname, PumpJackSettings.WorkPerMinute / res.workNeeded);
                    else log.AppendFormat("\nResource: {0,-14}, Rate: {1,5:F2} pM", res.shortname, QuarrySettings.WorkPerMinute / res.workNeeded);
                }
                return (log.ToString());
            }
            finally
            {
                Pool.FreeUnmanaged(ref log);
            }
        }

        #region Commands

        private void CCmdRefresh(IPlayer iplayer, string command, string[] args)
        {
            var player = iplayer.Object as BasePlayer;

            var count = RefillMiningQuarries(true);

            if (player != null) SendChatMessage(player, "Refreshed {0} of {1} quarry resources.", count, _miningQuarries.Count);
            PrintToLog($"Refreshed {count} of {_miningQuarries.Count} quarry resources.");
        }
        
        private void CCmdResetDeposit(IPlayer iplayer, string command, string[] args)
        {
            var player = iplayer.Object as BasePlayer;
            if (player == null) return;
            if (!player.IsAdmin &&  !IsAdmin((ulong)player.userID)) return;

            _storedData.quarryDataList.Clear();
            var count = RefillMiningQuarries(true);

            if (player != null) SendChatMessage(player, "Reset resource deposit of {0} quarry.", _miningQuarries.Count);
            else Puts($"Reset resource deposit of {_miningQuarries.Count} quarry.");
        }

        private void CCmdInfo(IPlayer iplayer, string command, string[] args)
        {
            if (iplayer.Id == "server_console") return;

            var player = iplayer.Object as BasePlayer;
            if (player == null) return;

            int count = 0;
            int loopcount = 0;
            StringBuilder log = Pool.Get<StringBuilder>();

            foreach (var miningQuarry in _miningQuarries)
            {
                if (miningQuarry == null || miningQuarry.IsDestroyed)
                {
                    continue;
                }
                var WorkPerMinute = 60f / miningQuarry.processRate * miningQuarry.workToAdd;
                if (Vector3Ex.Distance2D(player.transform.position, miningQuarry.transform.position) < PlayerRadius)
                {
                    int index = 0;
                    foreach (var quarryData in _storedData.quarryDataList)
                    {
                        if (quarryData == null)
                        {
                            continue;
                        }
                        if (Vector3Ex.Distance2D(quarryData.position, miningQuarry.transform.position) < MatchRadius)
                        {
                            count++;
                            log.AppendFormat("Datafile contain {0} entry,  Quarry count {1} \n", _storedData.quarryDataList.Count, _miningQuarries.Count);
                            log.AppendFormat("Datafile for Quarry at : {0}\n", PositionToString(quarryData.position));
                            log.Append(getDepositInfo(quarryData));
                        }
                        index++;
                    }

                    log.AppendFormat("\nDeposit info\n");
                    log.Append(getDepositIn
// ... [Code preview truncated due to length. Full source in attached file] ...

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