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

FREE DamageDisplay : 1.6.1 1.6.1

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

namespace Oxide.Plugins
{

    [Info("DamageDisplayGUI", "cogu", "1.6.1")]
    [Description("Displays the given damage to a player in a GUI")]
    class DamageDisplay : RustPlugin
    {
		/////////////////////////////////////////////////////////\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
		///////////////////////////////////////				Configs			\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
		/////////////////////////////////////////////////////////\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
				
        HashSet<ulong> users = new HashSet<ulong>();
		System.Collections.Generic.List<ulong> DisabledFor = new System.Collections.Generic.List<ulong>();
		public float DisplayAttackerNameRange => Config.Get<float>("DisplayAttackerNameRange");
		public float DisplayVictimNameRange => Config.Get<float>("DisplayVictimNameRange");
		public bool DisplayDistance => Config.Get<bool>("DisplayDistance");
		public bool DisplayBodyPart => Config.Get<bool>("DisplayBodyPart");
		public bool DamageForAttacker => Config.Get<bool>("DamageForAttacker");
		public bool DamageForVictim => Config.Get<bool>("DamageForVictim");
		public float X_MinVictim => Config.Get<float>("X_MinVictim");
		public float X_MaxVictim => Config.Get<float>("X_MaxVictim");
		public float Y_MinVictim => Config.Get<float>("Y_MinVictim");
		public float Y_MaxVictim => Config.Get<float>("Y_MaxVictim");
		public float X_MinAttacker => Config.Get<float>("X_MinAttacker");
		public float X_MaxAttacker => Config.Get<float>("X_MaxAttacker");
		public float Y_MinAttacker => Config.Get<float>("Y_MinAttacker");
		public float Y_MaxAttacker => Config.Get<float>("Y_MaxAttacker");
		public float DisplayTime => Config.Get<float>("DisplayTime");
		void Unload() => SaveData();
        void OnServerSave() => SaveData();
		
		protected override void LoadDefaultConfig()
        {	
			Config["DisplayAttackerNameRange"] = 50;
			Config["DisplayVictimNameRange"] = 50;
			Config["DisplayDistance"] = true;
			Config["DisplayBodyPart"] = false;
			Config["DamageForVictim"] = true;
			Config["DamageForAttacker"] = true;
			Config["X_MinVictim"] = 0.355;
			Config["X_MaxVictim"] = 0.475;
			Config["Y_MinVictim"] = 0.91;
			Config["Y_MaxVictim"] = 0.99;
			Config["X_MinAttacker"] = 0.555;
			Config["X_MaxAttacker"] = 0.675;
			Config["Y_MinAttacker"] = 0.91;
			Config["Y_MaxAttacker"] = 0.99;
			Config["DisplayTime"] = 0.3f;
			SaveConfig();
        }
		
		/////////////////////////////////////////////////////////\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\

        private void OnEntityTakeDamage(BaseCombatEntity victim, HitInfo hitInfo)
        {
			
            if (victim == null || hitInfo == null) return;
            DamageType type = hitInfo.damageTypes.GetMajorityDamageType();
            if (type == null) return;

            if (hitInfo?.Initiator != null && hitInfo?.Initiator?.ToPlayer() != null && users.Contains(hitInfo.Initiator.ToPlayer().userID) && victim.ToPlayer() != null)
            {
				/////////////////////////////////////////////////////////\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
				///////////////////////////////////////				Configs			\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
				/////////////////////////////////////////////////////////\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
				
				string vName = "";
				string aName = "";
				string bodypart = "";
				string distance = "";
				float displaytime = DisplayTime;
				float xminvictim = X_MinVictim;
				float xmaxvictim = X_MaxVictim;
				float yminvictim = Y_MinVictim;
				float ymaxvictim = Y_MaxVictim;
				float xminattacker = X_MinAttacker;
				float xmaxattacker = X_MaxAttacker;
				float yminattacker = Y_MinAttacker;
				float ymaxattacker = Y_MaxAttacker;
				float distanceBetween = Vector3.Distance(victim.transform.position,hitInfo.Initiator.ToPlayer().transform.position);
				float displayattackerrange = DisplayAttackerNameRange;
				float displayvictimrange = DisplayVictimNameRange;
				/////////////////////////////////////////////////////////\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
				
				/////////////////////////////////////////////////////////\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
				///////////////////////////////////////				Handling		\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
				/////////////////////////////////////////////////////////\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
				
                NextTick(() =>
                {
				double damage = System.Convert.ToDouble(Math.Round(hitInfo.damageTypes.Total(), 0, MidpointRounding.AwayFromZero));
				if(DisplayAttackerNameRange == -1){
					displayattackerrange = 65535;
				}
				if(DisplayVictimNameRange == -1){
					displayvictimrange = 65535;
				}
				if(DisplayBodyPart && hitInfo?.Initiator?.ToPlayer() != victim.ToPlayer()){
					bodypart = FirstUpper(GetBoneName(victim, ((uint)hitInfo?.HitBone)));
				}
				if(hitInfo?.Initiator?.ToPlayer() != victim.ToPlayer() && distanceBetween <= displayattackerrange){
					aName = hitInfo?.Initiator?.ToPlayer().displayName;
				}
				if(hitInfo?.Initiator?.ToPlayer() != victim.ToPlayer() && distanceBetween <= displayvictimrange){
					vName = victim.ToPlayer().displayName;
				}
				if(DisplayDistance && hitInfo?.Initiator?.ToPlayer() != victim.ToPlayer()){
					distance = GetDistance(victim, hitInfo);
				}
				NextTick(() =>
                {
					if(DamageForAttacker && hitInfo?.Initiator?.ToPlayer() != victim.ToPlayer()){
						UseUI(hitInfo?.Initiator?.ToPlayer(), "-"+damage.ToString()+" HP", distance, vName, bodypart, xminattacker, xmaxattacker, yminattacker, ymaxattacker);
					}
					if(DamageForVictim && hitInfo?.Initiator?.ToPlayer() != victim.ToPlayer()){
						UseUI(victim.ToPlayer(), "<color=#cc0000>-"+damage.ToString()+" HP"+"</color>", "<color=#cc0000>"+distance+"</color>", "<color=#cc0000>"+aName+"</color>", "<color=#cc0000>"+bodypart+"</color>", xminvictim, xmaxvictim, yminvictim, ymaxvictim);
					}
				});
							timer.Once(displaytime, () =>
							{
								DestroyNotification(hitInfo?.Initiator?.ToPlayer());
								DestroyNotification(victim.ToPlayer());
							});
                });
				/////////////////////////////////////////////////////////\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
				
            }
        }
		
		/////////////////////////////////////////////////////////\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
		/////////////////////////////////					  Extra					 \\\\\\\\\\\\\\\\\\\\\\\\\\
		/////////////////////////////////////////////////////////\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
		
		void Loaded()
        {
            LoadSavedData();
			Puts("DamageDisplay by cogu is now LIVE!");
			foreach (BasePlayer player in BasePlayer.activePlayerList)
			{
				users.Add(player.userID);
			}
        }
		
		void OnPlayerInit()
		{
			foreach (BasePlayer player in BasePlayer.activePlayerList)
			{
				users.Add(player.userID);
			}
		}

        void SaveData() => Interface.Oxide.DataFileSystem.WriteObject("DamageDisplay", users);
        void LoadSavedData()
        {
            HashSet<ulong> users = Interface.Oxide.DataFileSystem.ReadObject<HashSet<ulong>>("DamageDisplay");
            this.users = users;
        }
		
		private void UseUI(BasePlayer player, string dmg, string dst, string name, string bpart, float xmin, float xmax, float ymin, float ymax)
        {
			float dtime = DisplayTime;
			
            var elements = new CuiElementContainer();
            CuiElement textElement = new CuiElement
                {
                    Name = "DamageDisplay",
                    Parent = "HUD/Overlay",
                    FadeOut = dtime,
                    Components =
                    {
                        new CuiTextComponent
                        {
                            Text = dmg+"\n"+dst+"\n"+bpart+"\n"+name,
                            FontSize = 18,
                            Align = TextAnchor.MiddleCenter,
                            FadeIn = dtime
                        },
                        new CuiOutlineComponent
                        {
                            Distance = "1.0 1.0",
                            Color = "0.0 0.0 0.0 1.0"
                        },
                        new CuiRectTransformComponent
                        {
                            AnchorMin = xmin + " " + ymin,
                            AnchorMax = xmax + " " + ymax
                        }
                    }
                };
				elements.Add(textElement);
            CuiHelper.AddUi(player, elements);
        }
		
		private void DestroyNotification(BasePlayer player)
		{
			CuiHelper.DestroyUi(player, "DamageDisplay");
		}
		
		string GetBoneName(BaseCombatEntity entity, uint boneId) => entity?.skeletonProperties?.FindBone(boneId)?.name?.english ?? "Body";
		string FirstUpper(string original)
        {
            if (original == string.Empty)
                return string.Empty;
            List<string> output = new List<string>();
            foreach (string word in original.Split(' '))
                output.Add(word.Substring(0, 1).ToUpper() + word.Substring(1, word.Length - 1));
            return ListToString(output, 0, " ");
        }
		string ListToString(List<string> list, int first, string seperator) => string.Join(seperator, list.Skip(first).ToArray());
		string GetDistance(BaseCombatEntity entity, HitInfo info)
            {
                float distance = 0.0f;
                if (entity != null && info.Initiator != null)
                {
                    distance = Vector3.Distance(info.Initiator.transform.position, entity.transform.position);
                }
                return distance.ToString("0.0").Equals("0.0") ? "" : distance.ToString("0.0") + "m";
            }
			
		/////////////////////////////////////////////////////////\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
	}
}

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