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 MagnetCrane;
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 (!c
// ... [Code preview truncated due to length. Full source in attached file] ...