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

FREE FixOilRigBoats : 1.0.2 1.0.2

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

namespace Oxide.Plugins
{
    [Info("FixOilRigBoats", "Nimant", "1.0.2")]
    class FixOilRigBoats : RustPlugin
    {            		
		
		#region Variables				
		
		private static List<Vector3> OilRigPositions = new List<Vector3>();
		
		#endregion
		
		#region Hooks
		
		private void Init() => LoadVariables();
		
		private void OnServerInitialized() 
		{
			OilRigPositions = TerrainMeta?.Path?.Monuments?.Where(x=> x.name.ToLower().Contains("oilrig")).Select(x=> new Vector3(x.transform.position.x, 0f, x.transform.position.z)).ToList();
			
			if (OilRigPositions?.Count > 0)
				timer.Once(10f, CheckBoatsToDecay);
			else
				Unsubscribe(nameof(OnEntityTakeDamage));
		}
		
		private void OnEntityTakeDamage(BaseBoat entity, HitInfo info)
        {
            if (OilRigPositions?.Count == 0 || entity == null || info == null) return;

			var damage = info.damageTypes.GetMajorityDamageType();			
			if (damage != Rust.DamageType.Decay) return;
			
			// отменяем дамаг от гниения в зоне нефтевышек
			if (IsPointNearOilRig(entity.transform.position))
				info.damageTypes.ScaleAll(0);						
        }
		
		#endregion
		
		#region Helpers
		
		private static bool IsPointNearOilRig(Vector3 entityPos)
		{
			foreach (var pos in OilRigPositions)
				if (Vector3.Distance(pos, entityPos) <= configData.DecayRadius)
					return true;
				
			return false;	
		}
		
		private void CheckBoatsToDecay()
		{
			var boats = BaseNetworkable.serverEntities.OfType<BaseBoat>().Where(x=> x != null && IsPointNearOilRig(x.transform.position)).ToList();
			
			if (boats.Count > 0)
				CommunityEntity.ServerInstance.StartCoroutine(DoDecayBoats(boats));
			
			timer.Once(60f, CheckBoatsToDecay);
		}
		
		private IEnumerator DoDecayBoats(List<BaseBoat> boats)
		{
			foreach (var boat in boats)
			{
				if (boat == null || boat.IsDestroyed) continue;
				boat.Hurt(boat.MaxHealth() / configData.TotalTimeDecay, Rust.DamageType.Generic, boat, false);
				yield return new WaitForSeconds(0.05f);
			}
		}
		
		#endregion
		
		#region Config        				
		
        private static ConfigData configData;
		
        private class ConfigData
        {            
			[JsonProperty(PropertyName = "Время до полного сгнивания лодок (минуты)")]
			public int TotalTimeDecay;
			[JsonProperty(PropertyName = "Радиус обнаружения лодок возле нефтевышек")]
			public float DecayRadius;
        }
		
        private void LoadVariables() => configData = Config.ReadObject<ConfigData>();        
		
        protected override void LoadDefaultConfig()
        {
            configData = new ConfigData
            {
                TotalTimeDecay = 200,
				DecayRadius = 50f
            };
            SaveConfig(configData);
			timer.Once(0.1f, ()=> SaveConfig(configData));
        }        
		
        private void SaveConfig(ConfigData config) => Config.WriteObject(config, true);
		
        #endregion
    }	
	
}

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