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

FREE FuelManager : ERSION ERSION

Нет прав для скачивания
C#:
using Newtonsoft.Json;
using Oxide.Core;
using Oxide.Game.Rust.Cui;
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Linq;
using UnityEngine;
using Object = UnityEngine.Object;
namespace Oxide.Plugins {
    [Info("FuelManager", "Nikedemos", VERSION)]
    [Description("Propel your vehicles with anything you want")]
    public class FuelManager : RustPlugin {
        /*
        [PluginReference]
        Plugin ImageLibrary;
        */
        public static FuelManager Instance;
        public static bool Unloading = false;
#region META
        public const string VERSION = "1.0.6";
#endregion
#region CONST
        public const ulong SteamIconID = 0;
        public static readonly string ChatPrefix = $"<color={ColorPalette.RustyYellow.hexValue}>[Fuel Manager]</color> ";
        public const string PREFAB_COCKPIT_NORMAL = "assets/content/vehicles/modularcar/module_entities/1module_cockpit.prefab";
        public const string PREFAB_COCKPIT_ARMORED = "assets/content/vehicles/modularcar/module_entities/1module_cockpit_armored.prefab";
        public const string PREFAB_COCKPIT_ENGINE = "assets/content/vehicles/modularcar/module_entities/1module_cockpit_with_engine.prefab";
        public const string PREFAB_COUNTER = "assets/prefabs/deployable/playerioents/counter/counter.prefab";
        public const int ITEM_BATTERY_SMALL = -692338819;
        public const int ITEM_BATTERY_MEDIUM = 2023888403;
        public const int ITEM_BATTERY_LARGE = 553270375;
        public const int ITEM_SULFUR = -1581843485;
        public const int ITEM_GUNPOWDER = -265876753;
        public const int ITEM_FERTILIZER = -930193596;
        public const int ITEM_DUNG = -1579932985;
        public const int ITEM_LOWGRADE = -946369541;
        public const int ITEM_CRUDE = -321733511;
        public const int ITEM_DIESEL = 1568388703;
        public const int ITEM_WATER_BOTTLE = -1039528932;
        public const int ITEM_BOTA_BAG = 613961768;
        public const int ITEM_WATER_JUG = -119235651;
        public const int ITEM_TORCH = 795236088;
        public const int ITEM_JACKHAMMER = 1488979457;
        public const int ITEM_DIVING_TANK = -2022172587;
        public const int ITEM_MINERS_HAT = -1539025626;
        public const int ITEM_LANTERN = 1658229558;
        public const int ITEM_TUNA_LAMP = -1478445584;
        public const int ITEM_CANDLE_HAT = 1714496074;
        public static readonly ReadOnlyDictionary<VehicleType, Vector3> COUNTER_LOCAL_POSITION = new ReadOnlyDictionary<VehicleType, Vector3>(new Dictionary<VehicleType, Vector3> {
            [VehicleType.Car]
            = new Vector3(0.2F, 0.6F, 0.168F), [VehicleType.Minicopter] = new Vector3(0, 0.8F, 0.95F), [VehicleType.Scrapheli] = new Vector3(-0.1F, 1.47F, 3.3F), [VehicleType.Rowboat] = new Vector3(0F, 0.7F, 1.85F), [VehicleType.Rhib] = new Vector3(0F, 2.06F, 0.57F), [VehicleType.HotAirBalloon] = new Vector3(-0.32F, 2.8F, 0.1F), [VehicleType.Train] = new Vector3(0.537F, 2.391F, -0.064F), [VehicleType.Crane] = new Vector3(-0.961F, 4.056F, 1.397F), [VehicleType.SubSolo] = new Vector3(0F, 1.148F, 0.343F), [VehicleType.SubDuo] = new Vector3(-0.435F, 1.34F, 0.84F),
        }
        );
        public static readonly ReadOnlyDictionary<VehicleType, Vector3> COUNTER_LOCAL_ROTATION = new ReadOnlyDictionary<VehicleType, Vector3>(new Dictionary<VehicleType, Vector3> {
            [VehicleType.Car]
            = new Vector3(340F, 190F, 0F), [VehicleType.Minicopter] = new Vector3(0, 180F, 0), [VehicleType.Scrapheli] = new Vector3(333.333F, 180F, 0F), [VehicleType.Rowboat] = new Vector3(330F, 180F, 0F), [VehicleType.Rhib] = new Vector3(331.333F, 180F, 0F), [VehicleType.HotAirBalloon] = new Vector3(90F, 180F, 0F), [VehicleType.Train] = new Vector3(0F, 180F, 0F), [VehicleType.Crane] = new Vector3(23.646F, 180F, 0F), [VehicleType.SubSolo] = new Vector3(350F, 180F, 0F), [VehicleType.SubDuo] = new Vector3(15F, 110F, 0F),
        }
        );
#endregion
#region LANG
        public const string MSG_GENERAL = "MSG_GENERAL";
        public const string MSG_VEHICLE = "MSG_VEHICLE";
        public const string MSG_VEHICLES = "MSG_VEHICLES";
        public const string MSG_VEHICLE_NAME_CAR = "MSG_VEHICLE_NAME_CAR";
        public const string MSG_VEHICLE_NAME_CARS = "MSG_VEHICLE_NAME_CARS";
        public const string MSG_VEHICLE_NAME_MINICOPTER = "MSG_VEHICLE_NAME_MINICOPTER";
        public const string MSG_VEHICLE_NAME_MINICOPTERS = "MSG_VEHICLE_NAME_MINICOPTERS";
        public const string MSG_VEHICLE_NAME_SCRAPHELI = "MSG_VEHICLE_NAME_SCRAPHELI";
        public const string MSG_VEHICLE_NAME_SCRAPHELIS = "MSG_VEHICLE_NAME_SCRAPHELIS";
        public const string MSG_VEHICLE_NAME_HAB= "MSG_VEHICLE_NAME_HAB";
        public const string MSG_VEHICLE_NAME_HABS = "MSG_VEHICLE_NAME_HABS";
        public const string MSG_VEHICLE_NAME_ROWBOAT = "MSG_VEHICLE_NAME_ROWBOAT";
        public const string MSG_VEHICLE_NAME_ROWBOATS = "MSG_VEHICLE_NAME_ROWBOATS";
        public const string MSG_VEHICLE_NAME_RHIB = "MSG_VEHICLE_NAME_RHIB";
        public const string MSG_VEHICLE_NAME_RHIBS = "MSG_VEHICLE_NAME_RHIBS";
        public const string MSG_VEHICLE_NAME_TRAIN = "MSG_VEHICLE_NAME_TRAIN";
        public const string MSG_VEHICLE_NAME_TRAINS = "MSG_VEHICLE_NAME_TRAINS";
        public const string MSG_VEHICLE_NAME_CRANE = "MSG_VEHICLE_NAME_CRANE";
        public const string MSG_VEHICLE_NAME_CRANES = "MSG_VEHICLE_NAME_CRANES";
        public const string MSG_VEHICLE_NAME_SUBSOLO = "MSG_VEHICLE_NAME_SUBSOLO";
        public const string MSG_VEHICLE_NAME_SUBDUO = "MSG_VEHICLE_NAME_SUBDUO";
        public const string MSG_VEHICLE_NAME_SUBSOLOS = "MSG_VEHICLE_NAME_SUBSOLOS";
        public const string MSG_VEHICLE_NAME_SUBDUOS = "MSG_VEHICLE_NAME_SUBDUOS";
        public const string MSG_AVAILABLE_FUELS = "MSG_AVAILABLE_FUELS";
        public const string MSG_VEHICLES_DONT_NEED_FUEL = "MSG_VEHICLES_DONT_NEED_FUEL";
        public const string MSG_THESE_VEHICLES_DONT_NEED_FUEL = "MSG_THESE_VEHICLES_DONT_NEED_FUEL";
        public const string MSG_REASON_OK = "MSG_REASON_OK";
        public const string MSG_REASON_FUEL_NOT_DEFINED = "MSG_REASON_FUEL_NOT_DEFINED";
        public const string MSG_REASON_FUEL_DISABLED = "MSG_REASON_FUEL_DISABLED";
        public const string MSG_REASON_VEHICLE_DISABLED = "MSG_REASON_VEHICLE_DISABLED";
        public const string MSG_REASON_NO_PERMISSION_FUEL = "MSG_REASON_NO_PERMISSION_FUEL";
        public const string MSG_REASON_NO_PERMISSION_VEHICLE = "MSG_REASON_NO_PERMISSION_VEHICLE";
        public const string MSG_GUI_NO_PERMISSION_SET = "MSG_NO_PERMISSION_SET";
        public const string MSG_CANT_USE_THIS_FUEL = "MSG_CANT_USE_THIS_FUEL";
        public const string MSG_GUI_PAGE = "MSG_GUI_PAGE";
        public const string MSG_GUI_CONSUMPTION_AMOUNT = "MSG_GUI_CONSUMPTION_AMOUNT";
        public const string MSG_GUI_MULTIPLIER = "MSG_GUI_MULTIPLIER";
        public const string MSG_GUI_CURRENT_VALUE = "MSG_GUI_CURRENT_VALUE";
        public const string MSG_GUI_COUNTERS_ENABLE = "MSG_GUI_COUNTERS_ENABLE";
        public const string MSG_GUI_COUNTERS_DISABLE = "MSG_GUI_COUNTERS_DISABLE";
        public const string MSG_GUI_DONT_NEED_FUEL = "MSG_GUI_DONT_NEED_FUEL";
        public const string MSG_GUI_NEED_FUEL = "MSG_GUI_NEED_FUEL";
        public const string MSG_GUI_ENABLED = "MSG_GUI_ENABLED";
        public const string MSG_GUI_DISABLED = "MSG_GUI_DISABLED";
        public const string MSG_GUI_RESTORE_DEFAULTS = "MSG_GUI_RESTORE_DEFAULTS";
        public const string MSG_GUI_PAGE_NEXT = "MSG_GUI_PAGE_NEXT";
        public const string MSG_GUI_PAGE_PREV = "MSG_GUI_PAGE_PREV";
        public const string MSG_GUI_CLEAR_PERM = "MSG_GUI_CLEAR_PERM";
        public const string MSG_GUI_REMOVE_ITEM = "MSG_GUI_REMOVE_ITEM";
        public const string MSG_GUI_FUEL_ENABLED = "MSG_GUI_FUEL_ENABLED";
        public const string MSG_GUI_FUEL_DISABLED = "MSG_GUI_FUEL_DISABLED";
        public const string MSG_GUI_PERM_NEEDED = "MSG_GUI_PERM_NEEDED";
        public const string MSG_GUI_ADD_NEW_ITEM = "MSG_GUI_ADD_NEW_ITEM";
        public const string MSG_GUI_CONSUMPTION_CONDITION = "MSG_GUI_CONSUMPTION_CONDITION";
        public const string MSG_GUI_CONSUMPTION_ITEM = "MSG_GUI_CONSUMPTION_ITEM";
        public const string MSG_GUI_CONSUMPTION_DATA = "MSG_GUI_CONSUMPTION_DATA";
        public const string MSG_GUI_CONSUMPTION_NONE = "MSG_GUI_CONSUMPTION_NONE";
        public const string MSG_GUI_CONSUMPTION_CONTENTS = "MSG_GUI_CONSUMPTION_CONTENTS";
        public static Dictionary<byte, string> ReasonStrings = new Dictionary<byte, string> {
            [REASON_OK]
            = MSG_REASON_OK, [REASON_FUEL_NOT_DEFINED] = MSG_REASON_FUEL_NOT_DEFINED, [REASON_FUEL_DISABLED] = MSG_REASON_FUEL_DISABLED, [REASON_FUEL_VEHICLE_DISABLED] = MSG_REASON_VEHICLE_DISABLED, [REASON_NO_PERMISSION_FUEL] = MSG_REASON_NO_PERMISSION_FUEL, [REASON_NO_PERMISSION_VEHICLE] = MSG_REASON_NO_PERMISSION_VEHICLE,
        }
        ;
        public static Dictionary<VehicleType, string> LangVehicleNameSingular = new Dictionary<VehicleType, string> {
            [VehicleType.Car]
            = MSG_VEHICLE_NAME_CAR, [VehicleType.Minicopter] = MSG_VEHICLE_NAME_MINICOPTER, [VehicleType.Rhib] = MSG_VEHICLE_NAME_RHIB, [VehicleType.Rowboat] = MSG_VEHICLE_NAME_ROWBOAT, [VehicleType.Scrapheli] = MSG_VEHICLE_NAME_SCRAPHELI, [VehicleType.HotAirBalloon] = MSG_VEHICLE_NAME_HAB, [VehicleType.Train] = MSG_VEHICLE_NAME_TRAIN, [VehicleType.Crane] = MSG_VEHICLE_NAME_CRANE, [VehicleType.SubSolo] = MSG_VEHICLE_NAME_SUBSOLO, [VehicleType.SubDuo] = MSG_VEHICLE_NAME_SUBDUO,
        }
        ;
        public static Dictionary<VehicleType, string> LangVehicleNamePlural = new Dictionary<VehicleType, string> {
            [VehicleType.Car]
            = MSG_VEHICLE_NAME_CARS, [VehicleType.Minicopter] = MSG_VEHICLE_NAME_MINICOPTERS, [VehicleType.Rhib] = MSG_VEHICLE_NAME_RHIBS, [VehicleType.Rowboat] = MSG_VEHICLE_NAME_ROWBOATS, [VehicleType.Scrapheli] = MSG_VEHICLE_NAME_SCRAPHELIS, [VehicleType.HotAirBalloon] = MSG_VEHICLE_NAME_HABS, [VehicleType.Train] = MSG_VEHICLE_NAME_TRAINS, [VehicleType.Crane] = MSG_VEHICLE_NAME_CRANES, [VehicleType.SubSolo] = MSG_VEHICLE_NAME_SUBSOLOS, [VehicleType.SubDuo] = MSG_VEHICLE_NAME_SUBDUOS,
        }
        ;
        public static Dictionary<string, string> LangMessages = new Dictionary<string, string> {
            [MSG_GENERAL]
            = "General", [MSG_VEHICLE] = "Vehicle", [MSG_VEHICLES] = "Vehicles", [MSG_VEHICLE_NAME_CAR] = "Modular Car", [MSG_VEHICLE_NAME_CARS] = "Modular Cars", [MSG_VEHICLE_NAME_MINICOPTER] = "Minicopter", [MSG_VEHICLE_NAME_MINICOPTERS] = "Minicopters", [MSG_VEHICLE_NAME_SCRAPHELI] = "Scrapheli", [MSG_VEHICLE_NAME_SCRAPHELIS] = "Scraphelis", [MSG_VEHICLE_NAME_HAB] = "HAB", [MSG_VEHICLE_NAME_HABS] = "HABs", [MSG_VEHICLE_NAME_ROWBOAT] = "Rowboat", [MSG_VEHICLE_NAME_ROWBOATS] = "Rowboats", [MSG_VEHICLE_NAME_RHIB] = "RHIB", [MSG_VEHICLE_NAME_RHIBS] = "RHIBs", [MSG_VEHICLE_NAME_TRAIN] = "Workcart", [MSG_VEHICLE_NAME_TRAINS] = "Workcarts", [MSG_VEHICLE_NAME_CRANE] = "Crane", [MSG_VEHICLE_NAME_CRANES] = "Cranes", [MSG_VEHICLE_NAME_SUBSOLO] = "Solo Sub", [MSG_VEHICLE_NAME_SUBSOLOS] = "Solo Subs", [MSG_VEHICLE_NAME_SUBDUO] = "Duo Sub", [MSG_VEHICLE_NAME_SUBDUOS] = "Duo Subs", [MSG_AVAILABLE_FUELS] = "{0} will accept the following items as fuel:", [MSG_VEHICLES_DONT_NEED_FUEL] = "Vehicles don't need any fuel to run.Enjoy!", [MSG_THESE_VEHICLES_DONT_NEED_FUEL] = "{0} don't need any fuel to run.Enjoy!", [MSG_CANT_USE_THIS_FUEL] = "You cannot drive a {0} that runs on {1}.\nReason: ", [MSG_REASON_OK] = "Everything went okay.",  //currently not used
            [MSG_REASON_FUEL_NOT_DEFINED]
            = "This fuel has no defined properties.", [MSG_REASON_FUEL_DISABLED] = "This fuel type is disabled for all vehicles.", [MSG_REASON_VEHICLE_DISABLED] = "This fuel type is disabled for this vehicle.", [MSG_REASON_NO_PERMISSION_FUEL] = "You don't have permission to use this fuel on any vehicles.", [MSG_REASON_NO_PERMISSION_VEHICLE] = "You don't have permission to use this fuel on this particular vehicle.", [MSG_GUI_PAGE] = "Page", [MSG_GUI_CONSUMPTION_AMOUNT] = "{0} consumption", [MSG_GUI_MULTIPLIER] = "{0} usage multiplier", [MSG_GUI_ENABLED] = "GUI enabled for {0}", [MSG_GUI_DISABLED] = "GUI disabled for {0}", [MSG_GUI_PAGE_NEXT] = "<< PREVIOUS PAGE", [MSG_GUI_PAGE_PREV] = "NEXT PAGE >>", [MSG_GUI_CURRENT_VALUE] = "CURRENT VALUE", [MSG_GUI_COUNTERS_ENABLE] = "Enable fuel Counters for {0}", [MSG_GUI_COUNTERS_DISABLE] = "Disable fuel Counters for {0}", [MSG_GUI_DONT_NEED_FUEL] = "{0} don't need fuel to run", [MSG_GUI_NEED_FUEL] = "{0} need fuel to run", [MSG_GUI_RESTORE_DEFAULTS] = "RESTORE TO DEFAULT", [MSG_GUI_CLEAR_PERM] = "CLEAR PERM", [MSG_GUI_REMOVE_ITEM] = "X", [MSG_GUI_FUEL_ENABLED] = "Enabled for {0}", [MSG_GUI_FUEL_DISABLED] = "Disabled for {0}", [MSG_GUI_NO_PERMISSION_SET] = "NO PERMISSION SET", [MSG_GUI_PERM_NEEDED] = "{0} fuel perm needed", [MSG_GUI_ADD_NEW_ITEM] = "Add new item (name or ID)", [MSG_GUI_CONSUMPTION_CONDITION] = "Damage condition (like diving tank)", [MSG_GUI_CONSUMPTION_ITEM] = "Consume item (like normal fuel)", [MSG_GUI_CONSUMPTION_DATA] = "Take from item data (like battery)", [MSG_GUI_CONSUMPTION_NONE] = "Unlimited (don't consume)", [MSG_GUI_CONSUMPTION_CONTENTS] = "Take from contents (like water/fuel)",
        }
        ;
        public static string VEH(VehicleType type, string userID = null, bool plural = false) {
            return plural ? MSG(LangVehicleNamePlural[type], userID) : MSG(LangVehicleNameSingular[type], userID);
        }
        public static string REASON(byte reason, string userID = null) {
            return MSG(ReasonStrings[reason], userID);
        }
        public static string MSG(string msg, string userID = null, params object[] args) {
            if (args == null) {
                return Instance.lang.GetMessage(msg, Instance, userID);
            }
            else {
                return string.Format(Instance.lang.GetMessage(msg, Instance, userID), args);
            }
        }
#endregion
#region PERMISSIONS
        public const string PERMISSION_VIP_1 = "fuelmanager.vip1";
        public const string PERMISSION_VIP_2 = "fuelmanager.vip2";
        public const string PERMISSION_VIP_3 = "fuelmanager.vip3";
        public const string PERMISSION_VIP_4 = "fuelmanager.vip4";
        public const string PERMISSION_VIP_5 = "fuelmanager.vip5";
        public const string PERMISSION_ADMIN = "fuelmanager.admin";
        public static bool HasPermission(BasePlayer player, string perm) {
            return Instance.permission.UserHasPermission(player.UserIDString, perm);
        }
#endregion
#region CONFIG
        public ConfigData configData;
        protected override void LoadDefaultConfig() {
            RestoreDefaultConfig();
        }
        private void ProcessConfigData() {
            if (configData.fuelDefinitions == null) {
                GenerateDefaultFuelDefinitions();
            }
            if (configData.version != VERSION) {
                var presentVersion = configData.version;
                if (presentVersion != VERSION && VERSION == "1.0.1") {
                    TrainUpdateMigration();
                }
                if (presentVersion != VERSION && VERSION == "1.0.2") {
                    CraneUpdateMigration();
                }
                if (presentVersion != VERSION && VERSION == "1.0.3") {
                    SubmarineUpdateMigration();
                }
                configData.version = VERSION;
                Instance.PrintWarning($"\n\nYou have succesfully updated from {presentVersion} to {VERSION}\n");
                SaveConfigData();
            }
        }
        private void TrainUpdateMigration() {
            //first: specific for global config, add missing train entries...if (!configData.specificCountersEnabled.ContainsKey(VehicleType.Train))
            {
                configData.specificCountersEnabled.Add(VehicleType.Train, true);
            }
            if (!configData.specificNoNeedForFuel.ContainsKey(VehicleType.Train)) {
                configData.specificNoNeedForFuel.Add(VehicleType.Train, false);
            }
            if (!configData.specificEnableGUI.ContainsKey(VehicleType.Train)) {
                configData.specificEnableGUI.Add(VehicleType.Train, true);
            }
            //second: missing fuel definitions
            foreach (var entry in configData.fuelDefinitions) {
                if (!entry.Value.specificVehicleSettings.ContainsKey(VehicleType.Train)) {
                    entry.Value.specificVehicleSettings.Add(VehicleType.Train, new VehicleFuelSpecifics());
                }
            }
        }
        private void CraneUpdateMigration() {
            //first: specific for global config, add missing train entries...if (!configData.specificCountersEnabled.ContainsKey(VehicleType.Crane))
            {
                configData.specificCountersEnabled.Add(VehicleType.Crane, true);
            }
            if (!configData.specificNoNeedForFuel.ContainsKey(VehicleType.Crane)) {
                configData.specificNoNeedForFuel.Add(VehicleType.Crane, false);
            }
            if (!configData.specificEnableGUI.ContainsKey(VehicleType.Crane)) {
                configData.specificEnableGUI.Add(VehicleType.Crane, true);
            }
            //second: missing fuel definitions
            foreach (var entry in configData.fuelDefinitions) {
                if (!entry.Value.specificVehicleSettings.ContainsKey(VehicleType.Crane)) {
                    entry.Value.specificVehicleSettings.Add(VehicleType.Crane, new VehicleFuelSpecifics());
                }
            }
        }
        private void SubmarineUpdateMigration() {
            if (!configData.specificCountersEnabled.ContainsKey(VehicleType.SubSolo)) {
                configData.specificCountersEnabled.Add(VehicleType.SubSolo, true);
            }
            if (!configData.specificCountersEnabled.ContainsKey(VehicleType.SubDuo)) {
                configData.specificCountersEnabled.Add(VehicleType.SubDuo, true);
            }
            if (!configData.specificNoNeedForFuel.ContainsKey(VehicleType.SubSolo)) {
                configData.specificNoNeedForFuel.Add(VehicleType.SubSolo, false);
            }
            if (!configData.specificNoNeedForFuel.ContainsKey(VehicleType.SubDuo)) {
                configData.specificNoNeedForFuel.Add(VehicleType.SubDuo, false);
            }
            if (!configData.specificEnableGUI.ContainsKey(VehicleType.SubSolo)) {
                configData.specificEnableGUI.Add(VehicleType.SubSolo, true);
            }
            if (!configData.specificEnableGUI.ContainsKey(VehicleType.SubDuo)) {
                configData.specificEnableGUI.Add(VehicleType.SubDuo, true);
            }
            //second: missing fuel definitions
            foreach (var entry in configData.fuelDefinitions) {
                if (!entry.Value.specificVehicleSettings.ContainsKey(VehicleType.SubSolo)) {
                    entry.Value.specificVehicleSettings.Add(VehicleType.SubSolo, new VehicleFuelSpecifics());
                }
                if (!entry.Value.specificVehicleSettings.ContainsKey(VehicleType.SubDuo)) {
                    entry.Value.specificVehicleSettings.Add(VehicleType.SubSolo, new VehicleFuelSpecifics());
                }
            }
        }
        private void RestoreDefaultConfig() {
            PrintWarning("Generating default config...");
            configData = new ConfigData();
            GenerateDefaultFuelDefinitions();
            if (Instance != null) {
                GuiManagerPlayer.GenerateAllVehicleGUIs();
            }
            SaveConfigData();
        }
        private void LoadConfigData() {
            PrintWarning("Loading configuration file...");
            try {
                configData = Config.ReadObject<ConfigData>();
                PrintWarning("Success.");
            }
            catch {
                configData = new ConfigData();
                PrintWarning("Loading failed, generating new...");
            }
            SaveConfigData();
        }
        private void SaveConfigData() {
            PrintWarning("Saving config...");
            Config.WriteObject(configData, true);
        }
        public static FuelDefinition GetDefaultFuelDefinitionForItem(int itemID) {
            switch (itemID) {
                case 0 : {
                    return null;
                }
                case ITEM_FERTILIZER : return new FuelDefinition {
                    itemID = itemID,
                }
                ;
                case ITEM_LOWGRADE : return new FuelDefinition {
                    itemID = itemID,
                }
                ;
                case ITEM_DUNG : return new FuelDefinition {
                    itemID = itemID, globalUsageMultiplier = 4.0F,
                }
                ;
                case ITEM_SULFUR : return new FuelDefinition {
                    itemID = itemID, globalUsageMultiplier = 15.0F,
                }
                ;
                case ITEM_GUNPOWDER : return new FuelDefinition {
                    itemID = itemID, globalUsageMultiplier = 5.0F,
                }
                ;
                case ITEM_CRUDE : return new FuelDefinition {
                    itemID = itemID, globalUsageMultiplier = 0.5F,
                }
                ;
                case ITEM_DIESEL : return new FuelDefinition {
                    itemID = itemID, globalUsageMultiplier = 0.1F
                }
                ;
                case ITEM_BATTERY_SMALL : return new FuelDefinition {
                    itemID = itemID, consumptionType = ConsumptionType.DataInt, globalUsageMultiplier = 4.0F, globalConsumptionAmount = 60,
                }
                ;
                case ITEM_BATTERY_MEDIUM : return new FuelDefinition {
                    itemID = itemID, consumptionType = ConsumptionType.DataInt, globalUsageMultiplier = 4.0F, globalConsumptionAmount = 60,
                }
                ;
                case ITEM_BATTERY_LARGE : return new FuelDefinition {
                    itemID = itemID, consumptionType = ConsumptionType.DataInt, globalUsageMultiplier = 4.0F, globalConsumptionAmount = 60,
                }
                ;
                case ITEM_WATER_BOTTLE : return new FuelDefinition {
                    itemID = itemID, consumptionType = ConsumptionType.Contents, globalUsageMultiplier = 8.0F, globalConsumptionAmount = 50, globalEnabled = false,
                }
                ;
                case ITEM_BOTA_BAG : return new FuelDefinition {
                    itemID = itemID, consumptionType = ConsumptionType.Contents, globalUsageMultiplier = 8.0F, globalConsumptionAmount = 50, globalEnabled = false,
                }
                ;
                case ITEM_WATER_JUG : return new FuelDefinition {
                    itemID = itemID, consumptionType = ConsumptionType.Contents, globalUsageMultiplier = 8.0F, globalConsumptionAmount = 50, globalEnabled = false,
                }
                ;
                case ITEM_TORCH : return new FuelDefinition {
                    itemID = itemID, consumptionType = ConsumptionType.Condition, globalUsageMultiplier = 1F, globalConsumptionAmount = 5, globalEnabled = false,
                }
                ;
                case ITEM_DIVING_TANK : case ITEM_JACKHAMMER : {
                    return new FuelDefinition {
                        itemID = itemID, consumptionType = ConsumptionType.Condition, globalUsageMultiplier = 1F, globalConsumptionAmount = 20,
                    }
                    ;
                }
                case ITEM_TUNA_LAMP : case ITEM_LANTERN : case ITEM_MINERS_HAT : case ITEM_CANDLE_HAT : {
                    return new FuelDefinition {
                        itemID = itemID, consumptionType = ConsumptionType.Contents, globalUsageMultiplier = 1F, globalConsumptionAmount = 1,
                    }
                    ;
                }
                default : {
                    var itemDef = ItemManager.FindItemDefinition(itemID);
                    var consumptionType = ConsumptionType.Item;
                    if (itemDef != null) {
                        if (itemDef.condition.enabled || itemDef.condition.repairable) {
                            consumptionType = ConsumptionType.Condition;
                        }
                    }
                    return new FuelDefinition {
                        itemID = itemID, consumptionType = consumptionType, globalUsageMultiplier = 1F, globalConsumptionAmount = 1,
                    }
                    ;
                }
            }
        }
        private void GenerateDefaultFuelDefinitions() {
            if (configData != null) {
                PrintWarning("Generating default fuel definitions...");
                configData.fuelDefinitions = new Dictionary<int, FuelDefinition> {
                    [ITEM_LOWGRADE]
                    = GetDefaultFuelDefinitionForItem(ITEM_LOWGRADE), [ITEM_BATTERY_SMALL] = GetDefaultFuelDefinitionForItem(ITEM_BATTERY_SMALL), [ITEM_TUNA_LAMP] = GetDefaultFuelDefinitionForItem(ITEM_TUNA_LAMP), [ITEM_DIVING_TANK] = GetDefaultFuelDefinitionForItem(ITEM_DIVING_TANK), [ITEM_LANTERN] = GetDefaultFuelDefinitionForItem(ITEM_LANTERN), [ITEM_BATTERY_MEDIUM] = GetDefaultFuelDefinitionForItem(ITEM_BATTERY_MEDIUM), [ITEM_BATTERY_LARGE] = GetDefaultFuelDefinitionForItem(ITEM_BATTERY_LARGE), [ITEM_JACKHAMMER] = GetDefaultFuelDefinitionForItem(ITEM_JACKHAMMER), [ITEM_FERTILIZER] = GetDefaultFuelDefinitionForItem(ITEM_FERTILIZER), [ITEM_DUNG] = GetDefaultFuelDefinitionForItem(ITEM_DUNG), [ITEM_SULFUR] = GetDefaultFuelDefinitionForItem(ITEM_SULFUR), [ITEM_GUNPOWDER] = GetDefaultFuelDefinitionForItem(ITEM_GUNPOWDER), [ITEM_CRUDE] = GetDefaultFuelDefinitionForItem(ITEM_CRUDE), [ITEM_DIESEL] = GetDefaultFuelDefinitionForItem(ITEM_DIESEL), [ITEM_BOTA_BAG] = GetDefaultFuelDefinitionForItem(ITEM_BOTA_BAG), [ITEM_WATER_JUG] = GetDefaultFuelDefinitionForItem(ITEM_WATER_JUG), [ITEM_WATER_BOTTLE] = GetDefaultFuelDefinitionForItem(ITEM_WATER_BOTTLE), [ITEM_TORCH] = GetDefaultFuelDefinitionForItem(ITEM_TORCH), [ITEM_CANDLE_HAT] = GetDefaultFuelDefinitionForItem(ITEM_CANDLE_HAT), [ITEM_MINERS_HAT] = GetDefaultFuelDefinitionForItem(ITEM_MINERS_HAT),
                }
                ;
                SaveConfigData();
            }
        }
        public enum SkinMode {
            AcceptAll, Whitelist, Blacklist
        }
        public enum ConsumptionType {
            None,  //don't consume anything, just pretend as if you have had
            Item,  //consume the item in the tank (like lowgrade)
            DataInt,  //consume from data int (like electricity)
            Condition,  //consume from item condition (like jackhammer/diving tank)
            Contents  //consume from item's contents (like water jug)
        }
        public enum VehicleType {
            Car, Minicopter, Scrapheli, Rowboat, Rhib, HotAirBalloon, Train, Crane, SubDuo, SubSolo,
        }
        public class VehicleFuelSpecifics {
            public string specificPermissionNeeded = null;
            public bool specificEnabled = true;
            public int specificConsumptionAmount = 1;
            //consume 1 item, 1 from data int, 1 from condition, or 1 from contents every time 1 lowgrade would've been consumed
            public float specificUsageMultiplier = 1.0F;
            //1.0F = default for lowgrade.Set it to 2.0F to use the fuel twice as often.Combine with consumptionAmount for different usage intervals.}
            public class FuelDefinition {
                public int itemID = 0;
                public SkinMode skinMode = SkinMode.AcceptAll;
                public List<ulong> skinIDs = new List<ulong>();
                public ConsumptionType consumptionType = ConsumptionType.Item;
                //both of those will be multiplied / logical AND-ed by their vehicle specific
                public string globalPermissionNeeded = null;
                public bool globalEnabled = true;
                public int globalConsumptionAmount = 1;
                //consume 1 item, 1 from data int, 1 from condition, or 1 from contents every time 1 lowgrade would've been consumed
                public float globalUsageMultiplier = 1.0F;
                //1.0F = default for lowgrade.Set it to 2.0F to use the fuel twice as often.Combine with consumptionAmount for different usage intervals.public Dictionary<VehicleType, VehicleFuelSpecifics> specificVehicleSettings = new Dictionary<VehicleType, VehicleFuelSpecifics>
                {
                    [VehicleType.Car]
                    = new VehicleFuelSpecifics(), [VehicleType.Minicopter] = new VehicleFuelSpecifics(), [VehicleType.Scrapheli] = new VehicleFuelSpecifics(), [VehicleType.Rowboat] = new VehicleFuelSpecifics(), [VehicleType.Rhib] = new VehicleFuelSpecifics(), [VehicleType.HotAirBalloon] = new VehicleFuelSpecifics(), [VehicleType.Train] = new VehicleFuelSpecifics(), [VehicleType.Crane] = new VehicleFuelSpecifics(), [VehicleType.SubSolo] = new VehicleFuelSpecifics(), [VehicleType.SubDuo] = new VehicleFuelSpecifics(),
                }
                ;
            }
            public class ConfigData {
                public string version = VERSION;
                //if this is set to true, vehicles will always think they have fuel and won't consume anything
                public bool globalCountersEnabled = true;
                public bool globalNoNeedForFuel = false;
                public bool globalEnableGUI = true;
                public Dictionary<VehicleType, bool> specificCountersEnabled = new Dictionary<VehicleType, bool> {
                    [VehicleType.Car]
                    = true, [VehicleType.Minicopter] = true, [VehicleType.Scrapheli] = true, [VehicleType.Rowboat] = true, [VehicleType.Rhib] = true, [VehicleType.HotAirBalloon] = true, [VehicleType.Train] = true, [VehicleType.Crane] = true, [VehicleType.SubSolo] = true, [VehicleType.SubDuo] = true,
                }
                ;
                public Dictionary<VehicleType, bool> specificNoNeedForFuel = new Dictionary<VehicleType, bool> {
                    [VehicleType.Car]
                    = false, [VehicleType.Minicopter] = false, [VehicleType.Scrapheli] = false, [VehicleType.Rowboat] = false, [VehicleType.Rhib] = false, [VehicleType.HotAirBalloon] = false, [VehicleType.Train] = false, [VehicleType.Crane] = false, [VehicleType.SubSolo] = false, [VehicleType.SubDuo] = false,
                }
                ;
                public Dictionary<VehicleType, bool> specificEnableGUI = new Dictionary<VehicleType, bool> {
                    [VehicleType.Car]
                    = true, [VehicleType.Minicopter] = true, [VehicleType.Scrapheli] = true, [VehicleType.Rowboat] = true, [VehicleType.Rhib] = true, [VehicleType.HotAirBalloon] = true, [VehicleType.Train] = true, [VehicleType.Crane] = true, [VehicleType.SubSolo] = true, [VehicleType.SubDuo] = true,
                }
                ;
                public Dictionary<int, FuelDefinition> fuelDefinitions = null;
            }
#endregion
#region COLORS
            public class ColorCode {
                public string hexValue;
                public UnityEngine.Color rustValue;
                public string rustString;
                public ColorCode(string hex) {
                    hex = hex.ToUpper();
                    hexValue = "#" + hex;
                    //extract the R, G, B
                    var r = (float)short.Parse(hex.Substring(0, 2), System.Globalization.NumberStyles.HexNumber) / 255;
                    var g = (float)short.Parse(hex.Substring(2, 2), System.Globalization.NumberStyles.HexNumber) / 255;
                    var b = (float)short.Parse(hex.Substring(4, 2), System.Globalization.NumberStyles.HexNumber) / 255;
                    rustValue = new UnityEngine.Color(r, g, b);
                    rustString = $"{r} {g} {b}";
                }
            }
            public static class ColorPalette {
                public static ColorCode Black = new ColorCode("000000");
                public static ColorCode White = new ColorCode("ffffff");
                public static ColorCode RustyRed = new ColorCode("ce422b");
                public static ColorCode RustyYellow = new ColorCode("cebd2b");
                public static ColorCode RustyGreen = new ColorCode("8fba45");
                public static ColorCode RustyAqua = new ColorCode("45b9ba");
                public static ColorCode RustyBlue = new ColorCode("4897ce");
                //player GUI colours
                public static ColorCode DirtyPink = new ColorCode("e8dcd3");
                public static ColorCode GreyDark = new ColorCode("3f3d36");
                public static ColorCode GreyLight = new ColorCode("9c9c9c");
                //menu colours
                public static ColorCode RedLight = new ColorCode("ff6b6b");
                public static ColorCode YellowLight = new ColorCode("ffd36b");
                public static ColorCode LimeLight = new ColorCode("d4ff6b");
                public static ColorCode GreenLight = new ColorCode("76ff6b");
                public static ColorCode AquaLight = new ColorCode("6bffef");
                public static ColorCode BlueLight = new ColorCode("6bbbff");
                public static ColorCode PurpleLight = new ColorCode("ad6bff");
                public static ColorCode PinkLight = new ColorCode("ff6be8");
                public static ColorCode OrangeLight = new ColorCode("fa5800");
                public static ColorCode PissYellowLight = new ColorCode("e5fa00");
                public static ColorCode OrangeDark = new ColorCode("802d00");
                public static ColorCode PissYellowDark = new ColorCode("758000");
                //
            }
#endregion
#region MONO
            //attach to the vehicle on spawn
            public class VehicleHelper : MonoBehaviour {
                public BaseVehicle vehicle;
                //OR, if not vehicle...public HotAirBalloon balloon;
                //in any case...public BaseCombatEntity mainEntity;
                //they both share this tho
                public uint vehicleNetID = 0;
                public VehicleType vehicleType;
                public StorageContainer fuelContainer;
                public EntityFuelSystem fuelSystem;
                public Dictionary<uint, PowerCounter> cockpitCounters = new Dictionary<uint, PowerCounter>();
                public static Dictionary<uint, VehicleHelper> VehicleToHelper = new Dictionary<uint, VehicleHelper>();
                public static Dictionary<uint, VehicleHelper> StorageToHelper = new Dictionary<uint, VehicleHelper>();
                //cache this for reasons
                public int lastFuelItemID = 0;
                public uint fuelContainerNetID = 0;
                public System.Func<Item, int, bool> canAcceptItemToRestore;
                public ItemDefinition[] onlyAllowedItemsToRestore;
                //this will also call some hooks
                //hot air ballons
                //non-hot air ballons (vehicles)
                public void Prepare(BaseCombatEntity newlySpawnedVehicle) {
                    mainEntity = newlySpawnedVehicle;
                    vehicle = newlySpawnedVehicle as BaseVehicle;
                    if (vehicle != null) {
                        //try various fuel systems
                        var maybeCar = vehicle as ModularCar;
                        if (maybeCar != null) {
                            vehicleType = VehicleType.Car;
                            fuelSystem = maybeCar.engineController.FuelSystem;
                        }
                        else {
                            var maybeCopter = vehicle as MiniCopter;
                            if (maybeCopter != null) {
                                var maybeScrapHeli = vehicle as ScrapTransportHelicopter;
                                if (maybeScrapHeli != null) {
                                    vehicleType = VehicleType.Scrapheli;
                                }
                                else {
                                    vehicleType = VehicleType.Minicopter;
                                }
                                fuelSystem = maybeCopter.GetFuelSystem();
                            }
                            else {
                                var maybeBoat = vehicle as MotorRowboat;
                                if (maybeBoat != null) {
                                    var maybeRhib = vehicle as RHIB;
                                    if (maybeRhib != null) {
                                        vehicleType = VehicleType.Rhib;
                                    }
                                    else {
                                        vehicleType = VehicleType.Rowboat;
                                    }
                                    fuelSystem = maybeBoat.fuelSystem;
                                }
                                else {
                                    var maybeTrain = vehicle as TrainEngine;
                                    if (maybeTrain != null) {
                                        vehicleType = VehicleType.Train;
                                        fuelSystem = maybeTrain.engineController.FuelSystem;
                                    }
                                    else {
                                        var maybeCrane = vehicle as BaseCrane;
                                        if (maybeCrane != null) {
                                            vehicleType = VehicleType.Crane;
                                            fuelSystem = maybeCrane.GetFuelSystem();
                                        }
                                        else {
                                            var maybeSubDuo = vehicle as SubmarineDuo;
                                            if (maybeSubDuo != null) {
                                                vehicleType = VehicleType.SubDuo;
                                                fuelSystem = maybeSubDuo.GetFuelSystem();
                                            }
                                            else {
                                                var maybeSubSolo = vehicle as BaseSubmarine;
                                                if (maybeSubSolo != null) {
                                                    vehicleType = VehicleType.SubSolo;
                                                    fuelSystem = maybeSubSolo.GetFuelSystem();
                                                }
                                            }
                                        }
                                    }
                                }
                            }
                        }
                        vehicleNetID = vehicle.net.ID;
                    }
                    else {
                        balloon = newlySpawnedVehicle as HotAirBalloon;
                        fuelSystem = balloon.fuelSystem;
                        vehicleType = VehicleType.HotAirBalloon;
                        vehicleNetID = balloon.net.ID;
                    }
                    VehicleHelper.VehicleToHelper.Add(vehicleNetID, this);
                    Instance.timer.Once(0.1F, () => {
                        PrepareFuelSystem();
                        //cars have counters spawned per-module
                        if (vehicleType != VehicleType.Car) {
                            if (vehicleType == VehicleType.HotAirBalloon) {
                                CheckCounterSituation(balloon);
                            }
                            else {
                                CheckCounterSituation(vehicle);
                            }
                        }
                    }
                    );
                }
                void OnDestroy() {
                    VehicleHelper.VehicleToHelper.Remove(vehicleNetID);
                    if (fuelContainerNetID != 0) VehicleHelper.StorageToHelper.Remove(fuelContainerNetID);
                    if (!Unloading) {
                        if (fuelContainer!=null) {
                            if (fuelContainer.inventory!=null) {
                                if (onlyAllowedItemsToRestore == null) {
                                    Instance.PrintError("ERROR: Problem restoring original fuel storage prefab's \"onlyAllowedItemToRestore\" ItemDefinition.If you see this message and your server is not unloading, that's bad.");
                                }
                                else {
                                    fuelContainer.inventory.onlyAllowedItems = onlyAllowedItemsToRestore;
                                }
                                if (canAcceptItemToRestore == null) {
                                    Instance.PrintError("ERROR: Problem restoring original fuel storage prefab's \"canAcceptItemToRestore\" Func<Item, int, bool>.If you see this message and your server is not unloading, that's bad.");
                                }
                                else {
                                    fuelContainer.inventory.canAcceptItem = canAcceptItemToRestore;
                                }
                            }
                        }
                    }
                }
                public void PrepareFuelSystem() {
                    if (fuelSystem == null) {
                        UnityEngine.Object.DestroyImmediate(this);
                        return;
                    }
                    fuelContainer = fuelSystem.fuelStorageInstance.Get(true);
                    if (fuelContainer == null) {
                    }
                    else {
                        fuelContainerNetID = fuelContainer.net.ID;
                        VehicleHelper.StorageToHelper.Add(fuelContainer.net.ID, this);
                        //if you skipped this step, RPC errors are gonna appear as soon as you unload the plugin
                        //and try to put fuel in a tank!
                        //so on plugin unload, those need to be restored.canAcceptItemToRestore = fuelContainer.inventory.canAcceptItem;
                        onlyAllowedItemsToRestore = fuelContainer.inventory.onlyAllowedItems;
                        fuelContainer.inventory.canAcceptItem = CanAcceptItemIntoFuelContainer;
                        fuelContainer.inventory.onlyAllowedItems = null;
                    }
                    var maybeCar = vehicle as ModularCar;
                    if (maybeCar != null) {
                        foreach (var module in maybeCar.AttachedModuleEntities) {
                            Instance.OnEntitySpawned(module);
                        }
                    }
                    UpdateCockpitCounters();
                }
                public bool CanBeUsedAsFuel(Item item) {
                    if (item == null) return false;
                    if (!Instance.configData.fuelDefinitions.ContainsKey(item.info.itemid)) {
                        return false;
                    }
                    //check if that fuel is enabled at all...if (!Instance.configData.fuelDefinitions[item.info.itemid].globalEnabled) return false;
                    //check if there's a skin requirement and if so - check if there's a match
                    if (!Instance.configData.fuelDefinitions[item.info.itemid].skinMode.Equals(SkinMode.AcceptAll)) {
                        if (Instance.configData.fuelDefinitions[item.info.itemid].skinIDs != null) {
                            if (Instance.configData.fuelDefinitions[item.info.itemid].skinMode.Equals(SkinMode.Whitelist)) {
                                //make sure the skin id exists
                                if (!Instance.configData.fuelDefinitions[item.info.itemid].skinIDs.Contains(item.skin)) {
                                    return false;
                                }
                            }
                            else if (Instance.configData.fuelDefinitions[item.info.itemid].skinMode.Equals(SkinMode.Blacklist)) {
                                //make sure the skin id doesn't exist
                                if (Instance.configData.fuelDefinitions[item.info.itemid].skinIDs.Contains(item.skin)) {
                                    return false;
                                }
                            }
                        }
                    }
                    //and now check if you can use it with that vehicle...if (!Instance.configData.fuelDefinitions[item.info.itemid].specificVehicleSettings[vehicleType].specificEnabled) return false;
                    return true;
                }
                //this will return current fuel usage based on what's inside the container and also vehicle type
                public float GetFuelUsageBasedOnVehicleAndItem() {
                    var item = fuelSystem.GetFuelItem();
                    if (!CanBeUsedAsFuel(item)) return 0F;
                    return Instance.configData.fuelDefinitions[item.info.itemid].globalUsageMultiplier * Instance.configData.fuelDefinitions[item.info.itemid].specificVehicleSettings[vehicleType].specificUsageMultiplier;
                }
#region HOOK RESPONSES
                public void OnVehicleModuleKill(BaseVehicleModule vehicleModule) {
                    cockpitCounters.Remove(vehicleModule.net.ID);
                }
                public void OnItemAddedToFuelContainer(Item item) {
                    //update cached item id
                    if (item.info.itemid != lastFuelItemID) {
                        lastFuelItemID = item.info.itemid;
                    }
                    UpdateCockpitCounters();
                }
                public void OnItemRemovedFromFuelContainer(Item item) {
                    lastFuelItemID = 0;
                    UpdateCockpitCounters();
                }
                public void CheckCounterSituation(BaseEntity thatSomething) {
                    //is there supposed to be a counter, but there isn't one?
                    bool countersEnabled = Instance.configData.globalCountersEnabled && Instance.configData.specificCountersEnabled[vehicleType];
                    var maybeCounter = thatSomething.gameObject.GetComponentInChildren<PowerCounter>();
                    bool countersPresent;
                    bool killedCounter = false;
                    if (maybeCounter != null) {
                        countersPresent = true;
                    }
                    else {
                        countersPresent = false;
                    }
                    if (countersPresent && countersEnabled) {
                        //do nothing, as nothing needs to be done
                    }
                    else {
                        if (!cou
// ... [Code preview truncated due to length. Full source in attached file] ...

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