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

FREE VehicleFuelManager : 0.3.2 0.3.2

Нет прав для скачивания
C#:
// Все права принадлежат дискорд сообществу https://discord.gg/VgNHPpNrz6
using Oxide.Core;
using Rust.Modular;
using System;
using System.Collections.Generic;

namespace Oxide.Plugins
{
	[Info("Vehicle Fuel Manager", "bsdinis", "0.3.2")]
	class VehicleFuelManager : RustPlugin
	{
		void Init()
		{
			Unsubscribe(nameof(OnEntitySpawned));

			try
			{
				config = Config.ReadObject<ConfigData>();
				if (config == null)
				{
					throw new Exception();
				}
				else
				{
					SaveConfig();
				}
			}
			catch
			{
				PrintError("CONFIG FILE IS INVALID.\nCheck config file and reload VehicleFuelManager.");
				Interface.Oxide.UnloadPlugin(Name);
				return;
			}
		}

		void OnServerInitialized()
		{
			timer.Once(
				0.25f,
				() =>
				{
					foreach (BaseNetworkable entity in BaseNetworkable.serverEntities)
					{
						BaseVehicle vehicle = entity as BaseVehicle;
						if (vehicle != null)
						{
							FuelSettings fuelSettings;
							if (!config.Vehicles.TryGetValue(vehicle.ShortPrefabName, out fuelSettings))
							{
								continue;
							}
							SetConsumption(vehicle, fuelSettings);
							if (fuelSettings.LockFuelContainer)
							{
								AddFuel(vehicle.GetFuelSystem() as EntityFuelSystem, fuelSettings);
							}
							ModularCar car = vehicle as ModularCar;
							if (car != null)
							{
								for (int i = 0; i < car.AttachedModuleEntities.Count; i++)
								{
									VehicleModuleEngine moduleEngine = car.AttachedModuleEntities[i] as VehicleModuleEngine;
									if (moduleEngine == null)
									{
										continue;
									}
									EngineModuleSettings moduleSettings;
									if (!config.EngineModules.TryGetValue(moduleEngine.ShortPrefabName, out moduleSettings))
									{
										continue;
									}
									ModuleEngines(moduleEngine, moduleSettings);
									if (moduleSettings.PartsTier < 1 || !moduleSettings.LockContainer)
									{
										continue;
									}
									EngineStorage engineStorage = moduleEngine.GetContainer() as EngineStorage;
									if (engineStorage == null)
									{
										continue;
									}
									engineStorage.AdminAddParts((moduleSettings.PartsTier > 3 ? 3 : moduleSettings.PartsTier));
								}
							}
							continue;
						}
						HotAirBalloon hab = entity as HotAirBalloon;
						if (hab != null)
						{
							FuelSettings fuelSettings;
							if (!config.Vehicles.TryGetValue(hab.ShortPrefabName, out fuelSettings))
							{
								continue;
							}
							if (fuelSettings.FuelPerSecond != null)
							{
								hab.fuelPerSec = fuelSettings.FuelPerSecond.Value;
							}
							if (fuelSettings.LockFuelContainer)
							{
								AddFuel(hab.fuelSystem, fuelSettings);
							}
						}
					}

					Subscribe(nameof(OnEntitySpawned));
				}
			);
		}

		void RemoveFuelFromLockedContainer(EntityFuelSystem fuelSystem)
		{
			if (fuelSystem == null)
			{
				return;
			}
			StorageContainer fuelContainer = fuelSystem.fuelStorageInstance.Get(fuelSystem.isServer);
			if (fuelContainer == null || !fuelContainer.IsLocked())
			{
				return;
			}
			fuelContainer.SetFlag(BaseEntity.Flags.Locked, false);
			ItemContainer container = fuelContainer.inventory;
			if (container == null)
			{
				return;
			}
			Item fuelItem = container.GetSlot(0);
			if (fuelItem == null)
			{
				return;
			}
			fuelItem.Remove();
		}

		void Unload()
		{
			Unsubscribe(nameof(OnEntitySpawned));

			foreach (BaseNetworkable entity in BaseNetworkable.serverEntities)
			{
				BaseVehicle vehicle = entity as BaseVehicle;
				if (vehicle != null)
				{
					RemoveFuelFromLockedContainer(vehicle.GetFuelSystem() as EntityFuelSystem);
					PlayerHelicopter heli = vehicle as PlayerHelicopter;
					if (heli != null)
					{
						heli.fuelPerSec = 0.5f;
						continue;
					}
					MotorRowboat boat = vehicle as MotorRowboat;
					if (boat != null)
					{
						if (boat.ShortPrefabName == "rowboat")
						{
							boat.fuelPerSec = 0.1f;
						}
						else if (boat.ShortPrefabName == "rhib")
						{
							boat.fuelPerSec = 0.25f;
						}
						continue;
					}
					BaseSubmarine sub = vehicle as BaseSubmarine;
					if (sub != null)
					{
						if (sub.ShortPrefabName == "submarinesolo.entity")
						{
							sub.idleFuelPerSec = 0.025f;
							sub.maxFuelPerSec = 0.13f;
						}
						else if (sub.ShortPrefabName == "submarineduo.entity")
						{
							sub.idleFuelPerSec = 0.03f;
							sub.maxFuelPerSec = 0.15f;
						}
						continue;
					}
					Snowmobile snow = vehicle as Snowmobile;
					if (snow != null)
					{
						snow.idleFuelPerSec = 0.03f;
						snow.maxFuelPerSec = 0.15f;
						continue;
					}
					/*Bike bike = vehicle as Bike;
					if (bike != null)
					{
						bike.idleFuelPerSec = 0.03f;
						bike.maxFuelPerSec = 0.15f;
						continue;
					}*/
					ModularCar car = vehicle as ModularCar;
					if (car != null)
					{
						for (int i = 0; i < car.AttachedModuleEntities.Count; i++)
						{
							VehicleModuleEngine moduleEngine = car.AttachedModuleEntities[i] as VehicleModuleEngine;
							if (moduleEngine == null)
							{
								continue;
							}
							VehicleModuleEngine.Engine engine = moduleEngine.engine;
							if (engine != null)
							{
								if (moduleEngine.ShortPrefabName == "1module_cockpit_with_engine")
								{
									engine.idleFuelPerSec = 0.025f;
									engine.maxFuelPerSec = 0.08f;
								}
								else if (moduleEngine.ShortPrefabName == "1module_engine")
								{
									engine.idleFuelPerSec = 0.04f;
									engine.maxFuelPerSec = 0.11f;
								}
							}
							EngineStorage engineStorage = moduleEngine.GetContainer() as EngineStorage;
							if (engineStorage == null || !engineStorage.inventory.IsLocked())
							{
								continue;
							}
							engineStorage.inventory.Clear();
							engineStorage.inventory.SetLocked(false);
						}
						continue;
					}
					MagnetCrane crane = vehicle as MagnetCrane;
					if (crane != null)
					{
						crane.idleFuelPerSec = 0.06668f;
						crane.maxFuelPerSec = 0.3334f;
						continue;
					}
					TrainEngine train = vehicle as TrainEngine;
					if (train != null)
					{
						train.idleFuelPerSec = 0.025f;
						train.maxFuelPerSec = 0.075f;
						continue;
					}
					continue;
				}
				HotAirBalloon hab = entity as HotAirBalloon;
				if (hab != null)
				{
					RemoveFuelFromLockedContainer(hab.fuelSystem);
					hab.fuelPerSec = 0.25f;
				}
			}
		}

		protected override void SaveConfig() => Config.WriteObject(config, true);

		protected override void LoadDefaultConfig()
		{
			config = new ConfigData
			{
				Vehicles = new Dictionary<string, FuelSettings>
				{
					{ "attackhelicopter.entity", new FuelSettings { StartingFuel = 0, LockFuelContainer = false, FuelPerSecond = 0.5f, IdleFuelPerSecond = null, MaxFuelPerSecond = null } },
					{ "minicopter.entity", new FuelSettings { StartingFuel = 0, LockFuelContainer = false, FuelPerSecond = 0.5f, IdleFuelPerSecond = null, MaxFuelPerSecond = null } },
					{ "scraptransporthelicopter", new FuelSettings { StartingFuel = 0, LockFuelContainer = false, FuelPerSecond = 0.5f, IdleFuelPerSecond = null, MaxFuelPerSecond = null } },
					{ "rowboat", new FuelSettings { StartingFuel = 0, LockFuelContainer = false, FuelPerSecond = 0.1f, IdleFuelPerSecond = null, MaxFuelPerSecond = null } },
					{ "rhib", new FuelSettings { StartingFuel = 0, LockFuelContainer = false, FuelPerSecond = 0.25f, IdleFuelPerSecond = null, MaxFuelPerSecond = null } },
					{ "submarinesolo.entity", new FuelSettings { StartingFuel = 0, LockFuelContainer = false, FuelPerSecond = null, IdleFuelPerSecond = 0.025f, MaxFuelPerSecond = 0.13f } },
					{ "submarineduo.entity", new FuelSettings { StartingFuel = 0, LockFuelContainer = false, FuelPerSecond = null, IdleFuelPerSecond = 0.03f, MaxFuelPerSecond = 0.15f } },
					{ "hotairballoon", new FuelSettings { StartingFuel = 0, LockFuelContainer = false, FuelPerSecond = 0.25f, IdleFuelPerSecond = null, MaxFuelPerSecond = null } },
					{ "snowmobile", new FuelSettings { StartingFuel = 0, LockFuelContainer = false, FuelPerSecond = null, IdleFuelPerSecond = 0.03f, MaxFuelPerSecond = 0.15f } },
					{ "tomahasnowmobile", new FuelSettings { StartingFuel = 0, LockFuelContainer = false, FuelPerSecond = null, IdleFuelPerSecond = 0.03f, MaxFuelPerSecond = 0.15f } },
					{ "4module_car_spawned.entity", new FuelSettings { StartingFuel = 0, LockFuelContainer = false, FuelPerSecond = null, IdleFuelPerSecond = null, MaxFuelPerSecond = null } },
					{ "3module_car_spawned.entity", new FuelSettings { StartingFuel = 0, LockFuelContainer = false, FuelPerSecond = null, IdleFuelPerSecond = null, MaxFuelPerSecond = null } },
					{ "2module_car_spawned.entity", new FuelSettings { StartingFuel = 0, LockFuelContainer = false, FuelPerSecond = null, IdleFuelPerSecond = null, MaxFuelPerSecond = null } },
					{ "motorbike", new FuelSettings { StartingFuel = 0, LockFuelContainer = false, FuelPerSecond = null, IdleFuelPerSecond = 0.03f, MaxFuelPerSecond = 0.15f } },
					{ "motorbike_sidecar", new FuelSettings { StartingFuel = 0, LockFuelContainer = false, FuelPerSecond = null, IdleFuelPerSecond = 0.03f, MaxFuelPerSecond = 0.15f } },
					{ "magnetcrane.entity", new FuelSettings { StartingFuel = 0, LockFuelContainer = false, FuelPerSecond = null, IdleFuelPerSecond = 0.06668f, MaxFuelPerSecond = 0.3334f } },
					{ "workcart.entity", new FuelSettings { StartingFuel = 0, LockFuelContainer = false, FuelPerSecond = null, IdleFuelPerSecond = 0.025f, MaxFuelPerSecond = 0.075f } },
					{ "workcart_aboveground.entity", new FuelSettings { StartingFuel = 0, LockFuelContainer = false, FuelPerSecond = null, IdleFuelPerSecond = 0.025f, MaxFuelPerSecond = 0.075f } },
					{ "workcart_aboveground2.entity", new FuelSettings { StartingFuel = 0, LockFuelContainer = false, FuelPerSecond = null, IdleFuelPerSecond = 0.025f, MaxFuelPerSecond = 0.075f } },
					{ "locomotive.entity", new FuelSettings { StartingFuel = 0, LockFuelContainer = false, FuelPerSecond = null, IdleFuelPerSecond = 0.035f, MaxFuelPerSecond = 0.1f } }
				},
				ModularCarsSpawnFullHealth = false,
				EngineModules = new Dictionary<string, EngineModuleSettings>
				{
					{ "1module_cockpit_with_engine", new EngineModuleSettings { PartsTier = 0, LockContainer = false, IdleFuelPerSecond = 0.025f, MaxFuelPerSecond = 0.08f } },
					{ "1module_engine", new EngineModuleSettings { PartsTier = 0, LockContainer = false, IdleFuelPerSecond = 0.04f, MaxFuelPerSecond = 0.11f } }
				}
			};
		}

		ConfigData config;
		class ConfigData
		{
			public Dictionary<string, FuelSettings> Vehicles;
			public bool ModularCarsSpawnFullHealth;
			public Dictionary<string, EngineModuleSettings> EngineModules;
		}

		class FuelSettings
		{
			public int StartingFuel;
			public bool LockFuelContainer;
			public float? FuelPerSecond;
			public float? IdleFuelPerSecond;
			public float? MaxFuelPerSecond;
		}

		class EngineModuleSettings
		{
			public int PartsTier;
			public bool LockContainer;
			public float IdleFuelPerSecond;
			public float MaxFuelPerSecond;
		}

		void SetConsumption(BaseVehicle vehicle, FuelSettings fuelSettings)
		{
			if (fuelSettings.FuelPerSecond != null)
			{
				PlayerHelicopter heli = vehicle as PlayerHelicopter;
				if (heli != null)
				{
					heli.fuelPerSec = fuelSettings.FuelPerSecond.Value;
					return;
				}
				MotorRowboat boat = vehicle as MotorRowboat;
				if (boat != null)
				{
					boat.fuelPerSec = fuelSettings.FuelPerSecond.Value;
					return;
				}
			}
			else if (fuelSettings.IdleFuelPerSecond != null && fuelSettings.MaxFuelPerSecond != null)
			{
				BaseSubmarine sub = vehicle as BaseSubmarine;
				if (sub != null)
				{
					sub.idleFuelPerSec = fuelSettings.IdleFuelPerSecond.Value;
					sub.maxFuelPerSec = fuelSettings.MaxFuelPerSecond.Value;
					return;
				}
				Snowmobile snow = vehicle as Snowmobile;
				if (snow != null)
				{
					snow.idleFuelPerSec = fuelSettings.IdleFuelPerSecond.Value;
					snow.maxFuelPerSec = fuelSettings.MaxFuelPerSecond.Value;
					return;
				}
				/*Bike bike = vehicle as Bike;
				if (bike != null)
				{
					bike.idleFuelPerSec = fuelSettings.IdleFuelPerSecond.Value;
					bike.maxFuelPerSec = fuelSettings.MaxFuelPerSecond.Value;
					return;
				}*/
				MagnetCrane crane = vehicle as MagnetCrane;
				if (crane != null)
				{
					crane.idleFuelPerSec = fuelSettings.IdleFuelPerSecond.Value;
					crane.maxFuelPerSec = fuelSettings.MaxFuelPerSecond.Value;
					return;
				}
				TrainEngine train = vehicle as TrainEngine;
				if (train != null)
				{
					train.idleFuelPerSec = fuelSettings.IdleFuelPerSecond.Value;
					train.maxFuelPerSec = fuelSettings.MaxFuelPerSecond.Value;
				}
			}
		}

		void OnEntitySpawned(BaseVehicle vehicle)
		{
			FuelSettings fuelSettings;
			if (!config.Vehicles.TryGetValue(vehicle.ShortPrefabName, out fuelSettings))
			{
				return;
			}
			SetConsumption(vehicle, fuelSettings);
			NextTick(
				() =>
				{
					if (vehicle == null)
					{
						return;
					}
					AddFuel(vehicle.GetFuelSystem() as EntityFuelSystem, fuelSettings);
					if (!config.ModularCarsSpawnFullHealth)
					{
						return;
					}
					ModularCar car = vehicle as ModularCar;
					if (car == null)
					{
						return;
					}
					for (int i = 0; i < car.AttachedModuleEntities.Count; i++)
					{
						car.AttachedModuleEntities[i].health = car.AttachedModuleEntities[i].MaxHealth();
					}
				}
			);
		}

		void OnEntitySpawned(HotAirBalloon hab)
		{
			FuelSettings fuelSettings;
			if (!config.Vehicles.TryGetValue(hab.ShortPrefabName, out fuelSettings))
			{
				return;
			}
			if (fuelSettings.FuelPerSecond != null)
			{
				hab.fuelPerSec = fuelSettings.FuelPerSecond.Value;
			}
			NextTick(
				() =>
				{
					if (hab != null)
					{
						AddFuel(hab.fuelSystem, fuelSettings);
					}
				}
			);
		}

		void AddFuel(EntityFuelSystem fuelSystem, FuelSettings fuelSettings)
		{
			if (fuelSystem == null)
			{
				return;
			}
			StorageContainer fuelContainer = fuelSystem.fuelStorageInstance.Get(fuelSystem.isServer);
			if (fuelContainer == null)
			{
				return;
			}
			if (fuelSettings.LockFuelContainer)
			{
				fuelContainer.SetFlag(BaseEntity.Flags.Locked, true);
			}
			if (fuelSettings.StartingFuel < 1)
			{
				return;
			}
			ItemContainer container = fuelContainer.inventory;
			if (container == null)
			{
				return;
			}
			Item fuel = ItemManager.Create(fuelContainer.allowedItem, fuelSettings.StartingFuel);
			if (fuel.MoveToContainer(container))
			{
				return;
			}
			fuel.Remove();
		}

		void ModuleEngines(VehicleModuleEngine moduleEngine, EngineModuleSettings moduleSettings)
		{
			if (moduleEngine == null || moduleEngine.Vehicle == null)
			{
				return;
			}
			VehicleModuleEngine.Engine engine = moduleEngine.engine;
			if (engine != null)
			{
				engine.idleFuelPerSec = moduleSettings.IdleFuelPerSecond;
				engine.maxFuelPerSec = moduleSettings.MaxFuelPerSecond;
			}
			if (!moduleSettings.LockContainer)
			{
				return;
			}
			EngineStorage engineStorage = moduleEngine.GetContainer() as EngineStorage;
			if (engineStorage == null)
			{
				return;
			}
			engineStorage.internalDamageMultiplier = 0.0f;
			engineStorage.inventory.SetLocked(true);
		}

		void OnEntitySpawned(VehicleModuleEngine moduleEngine)
		{
			NextTick(
				() =>
				{
					if (moduleEngine == null)
					{
						return;
					}
					EngineModuleSettings moduleSettings;
					if (!config.EngineModules.TryGetValue(moduleEngine.ShortPrefabName, out moduleSettings))
					{
						return;
					}
					ModuleEngines(moduleEngine, moduleSettings);
					EngineStorage engineStorage = moduleEngine.GetContainer() as EngineStorage;
					if (engineStorage == null || moduleSettings.PartsTier < 1)
					{
						return;
					}
					engineStorage.AdminAddParts((moduleSettings.PartsTier > 3 ? 3 : moduleSettings.PartsTier));
				}
			);
		}

		object OnVehicleModuleMove(VehicleModuleEngine moduleEngine)
		{
			EngineStorage engineStorage = moduleEngine.GetContainer() as EngineStorage;
			if (engineStorage == null || !engineStorage.inventory.IsLocked())
			{
				return null;
			}
			return true;
		}

		object OnItemLock(Item item)
		{
			if (item.parent == null)
			{
				return null;
			}
			ModularCar car = item.parent.entityOwner as ModularCar;
			if (car == null)
			{
				return null;
			}
			VehicleModuleEngine moduleEngine = car.GetModuleForItem(item) as VehicleModuleEngine;
			if (moduleEngine == null)
			{
				return null;
			}
			EngineStorage engineStorage = moduleEngine.GetContainer() as EngineStorage;
			if (engineStorage == null || !engineStorage.inventory.IsLocked())
			{
				return null;
			}
			return false;
		}

		void OnEntityKill(VehicleModuleEngine moduleEngine)
		{
			EngineStorage engineStorage = moduleEngine.GetContainer() as EngineStorage;
			if (engineStorage == null || !engineStorage.inventory.IsLocked())
			{
				return;
			}
			engineStorage.Kill();
		}
	}
}

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