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

FREE Accuracy : 0.0.6 0.0.6

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

namespace Oxide.Plugins {
    [Info("Accuracy", "Pho3niX90", "0.0.6")]
    [Description("Accuracy System")]
    public class Accuracy : RustPlugin {
        [PluginReference] Plugin ZoneManager;

        const string PERMISSION_NAME = "accuracy.use";
        new Dictionary<ulong, AccuracyData> _allData;
        AccuracyData _globalData;
        new Dictionary<ulong, string> openPanels;
        Dictionary<string, int> lineNum;

        #region Helpers
        void Init() {
            if (!permission.PermissionExists(PERMISSION_NAME, this)) permission.RegisterPermission(PERMISSION_NAME, this);
        }

        void Loaded() {
            lineNum = new Dictionary<string, int>();
            openPanels = new Dictionary<ulong, string>();
            _allData = new Dictionary<ulong, AccuracyData>();
            _globalData = new AccuracyData();
        }

        void Unload() {
            foreach (BasePlayer player in BasePlayer.activePlayerList)
                DestroyUI(player);
        }

        void OnPlayerAttack(BasePlayer attacker, HitInfo info) {
            if (!permission.UserHasPermission(attacker.UserIDString, PERMISSION_NAME)) return;

            attacker.GetActiveItem()._condition = attacker.GetActiveItem()._maxCondition;
            if (!_allData.ContainsKey(attacker.userID)) {
                _allData.Add(attacker.userID, new AccuracyData());
            }

            //Track shots
            _allData[attacker.userID].shots++;
            _globalData.shots++;

            // Track last projectile distance
            int distance = (int)Math.Round(info.ProjectileDistance);
            _globalData.distanceLast = distance;
            _allData[attacker.userID].distanceLast = distance;

            bool isLanded = false;
            bool isHeadshot = false;
            if (!info.boneName.Equals("N/A")) {
                isLanded = true;

                // Track landed shots, and total distance for average calc
                _allData[attacker.userID].shotsLanded++;
                _allData[attacker.userID].distanceTotal += Math.Round(info.ProjectileDistance);
                _globalData.shotsLanded++;
                _globalData.distanceTotal += Math.Round(info.ProjectileDistance);

                // Track body part hits
                switch (info.boneArea) {
                    case HitArea.Head:
                        _allData[attacker.userID].Head++;
                        _globalData.Head++;
                        isHeadshot = true;
                        break;
                    case HitArea.Chest:
                        _allData[attacker.userID].Chest++;
                        _globalData.Chest++;
                        break;
                    case HitArea.Stomach:
                        _allData[attacker.userID].Stomach++;
                        _globalData.Stomach++;
                        break;
                    case HitArea.Arm:
                        _allData[attacker.userID].Arm++;
                        _globalData.Arm++;
                        break;
                    case HitArea.Hand:
                        _allData[attacker.userID].Hand++;
                        _globalData.Hand++;
                        break;
                    case HitArea.Leg:
                        _allData[attacker.userID].Leg++;
                        _globalData.Leg++;
                        break;
                    case HitArea.Foot:
                        _allData[attacker.userID].Foot++;
                        _globalData.Foot++;
                        break;
                }
            }
            // Track projectile distance, along with body part hits
            if (distance <= 29) {
                _allData[attacker.userID].data_25m.shots++;
                _globalData.data_25m.shots++;
                if (isLanded) {
                    _allData[attacker.userID].data_25m.shotsLanded++;
                    _globalData.data_25m.shotsLanded++;
                }
                if (isHeadshot) {
                    _allData[attacker.userID].data_25m.Head++;
                    _globalData.data_25m.Head++;
                }

            } else if (distance > 29 && distance <= 54) { //50m
                _allData[attacker.userID].data_50m.shots++;
                _globalData.data_50m.shots++;
                if (isLanded) {
                    _allData[attacker.userID].data_50m.shotsLanded++;
                    _globalData.data_50m.shotsLanded++;
                }
                if (isHeadshot) {
                    _allData[attacker.userID].data_50m.Head++;
                    _globalData.data_50m.Head++;
                }
            } else if (distance > 54 && distance <= 110) { //100m
                _allData[attacker.userID].data_100m.shots++;
                _globalData.data_100m.shots++;
                if (isLanded) {
                    _allData[attacker.userID].data_100m.shotsLanded++;
                    _globalData.data_100m.shotsLanded++;
                }
                if (isHeadshot) {
                    _allData[attacker.userID].data_100m.Head++;
                    _globalData.data_100m.Head++;
                }
            } else if (distance > 110 && distance <= 154) { //150m
                _allData[attacker.userID].data_150m.shots++;
                _globalData.data_150m.shots++;
                if (isLanded) {
                    _allData[attacker.userID].data_150m.shotsLanded++;
                    _globalData.data_150m.shotsLanded++;
                }
                if (isHeadshot) {
                    _allData[attacker.userID].data_150m.Head++;
                    _globalData.data_150m.Head++;
                }

            } else if (distance > 154 && distance <= 204) { //200m
                _allData[attacker.userID].data_200m.shots++;
                _globalData.data_200m.shots++;
                if (isLanded) {
                    _allData[attacker.userID].data_200m.shotsLanded++;
                    _globalData.data_200m.shotsLanded++;
                }
                if (isHeadshot) {
                    _allData[attacker.userID].data_200m.Head++;
                    _globalData.data_200m.Head++;
                }

            } else if (distance > 204) { //250m +
                _allData[attacker.userID].data_250m.shots++;
                _globalData.data_250m.shots++;
                if (isLanded) {
                    _allData[attacker.userID].data_250m.shotsLanded++;
                    _globalData.data_250m.shotsLanded++;
                }
                if (isHeadshot) {
                    _allData[attacker.userID].data_250m.Head++;
                    _globalData.data_250m.Head++;
                }
            }

            // update UI
            NextTick(() => {
                UpdateUI(attacker);
            });
        }
        #endregion

        #region Console Commands
        [ConsoleCommand("Accuracy_ResetStats")]
        private void cmdUI_ResetStats(ConsoleSystem.Arg arg) {
            var player = arg.Connection.player as BasePlayer;
            cmdStats(player, null, null);
        }
        [ConsoleCommand("Accuracy_ToggleExtraStats")]
        private void cmdUI_ExtraStats(ConsoleSystem.Arg arg) {
            var player = arg.Connection.player as BasePlayer;
            if (_allData.ContainsKey(player.userID)) {
                if (_allData[player.userID].showExtraInfo) DestroyUI(player);
                _allData[player.userID].showExtraInfo = !_allData[player.userID].showExtraInfo;
                UpdateUI(player);
            }
        }
        [ConsoleCommand("Accuracy_ToggleInfiniteAmmo")]
        private void cmdUI_InfiniteAmmo(ConsoleSystem.Arg arg) {
            var player = arg.Connection.player as BasePlayer;
            if (_allData.ContainsKey(player.userID)) {
                _allData[player.userID].infiniteAmmo = !_allData[player.userID].infiniteAmmo;
                UpdateUI(player);
            }
        }
        #endregion

        #region Chat Commands
        [ChatCommand("reset")]
        private void cmdStats(BasePlayer player, string command, string[] args) {
            ResetData(player.userID);
            SendReply(player, "Accuracy data reset");
            UpdateUI(player);
        }
        #endregion

        #region Game Hooks
        void OnPlayerDisconnected(BasePlayer player, string reason) {
            ResetData(player.userID);
        }
        #endregion

        #region Plugin Hooks
        void OnEnterZone(string ZoneID, BasePlayer player) {
            if (permission.UserHasPermission(player.UserIDString, PERMISSION_NAME)) {
                if (!openPanels.ContainsKey(player.userID)) {
                    if (!_allData.ContainsKey(player.userID)) {
                        _allData.Add(player.userID, new AccuracyData());
                    }
                    CreateUI(player);
                }
            } else {
                if (openPanels.ContainsKey(player.userID)) {
                    DestroyUI(player);
                    if (_allData.ContainsKey(player.userID)) {
                        _allData.Remove(player.userID);
                    }
                }
            }
        }
        #endregion

        #region Data
        AccuracyData GetAccData(ulong playerId) {
            AccuracyData data;
            if (_allData.ContainsKey(playerId)) {
                data = _allData[playerId];
            } else {
                data = new AccuracyData();
                _allData.Add(playerId, data);
            }
            return data;
        }

        void ResetData(ulong playerId) {
            AccuracyData data;
            if (_allData.ContainsKey(playerId)) {
                _allData[playerId].Reset();
            }
        }
        #endregion

        #region Classes
        public class AccuracyDataChild {
            public int shots;
            public int shotsLanded;
            public double distanceTotal;
            public int distanceLast;
            public double damageTotal;
            //Area
            public int Head = 0;
            public int Chest = 0;
            public int Stomach = 0;
            public int Arm = 0;
            public int Hand = 0;
            public int Leg = 0;
            public int Foot = 0;

            public int Missed() {
                return shots - shotsLanded;
            }

            public string MissedRate() {
                return Math.Round((1d - ((double)shotsLanded / (double)shots)) * 100) + "%";
            }

            public string Rate(HitArea area) {
                int landed = 0;
                switch (area) {
                    case HitArea.Head:
                        landed = Head;
                        break;
                    case HitArea.Chest:
                        landed = Chest;
                        break;
                    case HitArea.Stomach:
                        landed = Stomach;
                        break;
                    case HitArea.Arm:
                        landed = Arm;
                        break;
                    case HitArea.Hand:
                        landed = Hand;
                        break;
                    case HitArea.Leg:
                        landed = Leg;
                        break;
                    case HitArea.Foot:
                        landed = Foot;
                        break;
                    default:
                        landed = shotsLanded;
                        break;
                }
                return Math.Round(((double)landed / (double)shots) * 100) + "%";
            }

            public string Rate() {
                return Math.Round(((double)shotsLanded / (double)shots) * 100) + "%";
            }
        }
        public class AccuracyData {
            public int shots;
            public int shotsLanded;
            public double distanceTotal;
            public int distanceLast;
            public double damageTotal;
            //Area
            public int Head = 0;
            public int Chest = 0;
            public int Stomach = 0;
            public int Arm = 0;
            public int Hand = 0;
            public int Leg = 0;
            public int Foot = 0;

            public bool showExtraInfo = false;
            public bool infiniteAmmo = false;

            public AccuracyDataChild data_25m;
            public AccuracyDataChild data_50m;
            public AccuracyDataChild data_100m;
            public AccuracyDataChild data_150m;
            public AccuracyDataChild data_200m;
            public AccuracyDataChild data_250m;

            public AccuracyData() {
                distanceTotal = 0;
                distanceLast = 0;
                shots = 0;
                shotsLanded = 0;
                Head = 0;
                Chest = 0;
                Stomach = 0;
                Arm = 0;
                Hand = 0;
                Leg = 0;
                Foot = 0;
                data_25m = new AccuracyDataChild();
                data_50m = new AccuracyDataChild();
                data_100m = new AccuracyDataChild();
                data_150m = new AccuracyDataChild();
                data_200m = new AccuracyDataChild();
                data_250m = new AccuracyDataChild();
            }

            public void Reset() {
                distanceTotal = 0;
                distanceLast = 0;
                shots = 0;
                shotsLanded = 0;
                Head = 0;
                Chest = 0;
                Stomach = 0;
                Arm = 0;
                Hand = 0;
                Leg = 0;
                Foot = 0;
                data_25m = new AccuracyDataChild();
                data_50m = new AccuracyDataChild();
                data_100m = new AccuracyDataChild();
                data_150m = new AccuracyDataChild();
                data_200m = new AccuracyDataChild();
                data_250m = new AccuracyDataChild();
            }

            public string Rate(HitArea area) {
                int landed = 0;
                switch (area) {
                    case HitArea.Head:
                        landed = Head;
                        break;
                    case HitArea.Chest:
                        landed = Chest;
                        break;
                    case HitArea.Stomach:
                        landed = Stomach;
                        break;
                    case HitArea.Arm:
                        landed = Arm;
                        break;
                    case HitArea.Hand:
                        landed = Hand;
                        break;
                    case HitArea.Leg:
                        landed = Leg;
                        break;
                    case HitArea.Foot:
                        landed = Foot;
                        break;
                    default:
                        landed = shotsLanded;
                        break;
                }
                return Math.Round(((double)landed / (double)shots) * 100) + "%";
            }

            public int Missed() {
                return shots - shotsLanded;
            }

            public string MissedRate() {
                return Math.Round((1d - ((double)shotsLanded / (double)shots)) * 100) + "%";
            }

            public string Rate() {
                return Math.Round(((double)shotsLanded / (double)shots) * 100) + "%";
            }

            public double distanceAvg() {
                return Math.Round(distanceTotal / shotsLanded);
            }
        }
        #endregion

        #region Helpers

        #endregion

        static List<string> clans = new List<string>();

        string mainElementAccuracy;
        string mainElementAccuracy25;
        string mainElementAccuracy50;
        string mainElementAccuracy100;
        string mainElementAccuracy150;
        string mainElementAccuracy200;
        string mainElementAccuracy250;
        string mainPanelAccuracyNameHeader = "mainHeaderPanelAccuracy";
        string mainPanelAccuracyNameHeader25 = "mainHeaderPanelAccuracy25";
        string mainPanelAccuracyNameHeader50 = "mainHeaderPanelAccuracy50";
        string mainPanelAccuracyNameHeader100 = "mainHeaderPanelAccuracy100";
        string mainPanelAccuracyNameHeader150 = "mainHeaderPanelAccuracy150";
        string mainPanelAccuracyNameHeader200 = "mainHeaderPanelAccuracy200";
        string mainPanelAccuracyNameHeader250 = "mainHeaderPanelAccuracy250";
        string mainPanelAccuracyName = "mainPanelAccuracy";
        string mainPanelAccuracyName25 = "mainPanelAccuracy25";
        string mainPanelAccuracyName50 = "mainPanelAccuracy50";
        string mainPanelAccuracyName100 = "mainPanelAccuracy100";
        string mainPanelAccuracyName150 = "mainPanelAccuracy150";
        string mainPanelAccuracyName200 = "mainPanelAccuracy200";
        string mainPanelAccuracyName250 = "mainPanelAccuracy250";
        string mainPanelButtons = "mainPanelButtons";

        #region UI
        [ChatCommand("top")]
        private void cmdCui(BasePlayer player, string command, string[] args) {
            CreateUI(player);
        }

        void _UILineNum(string panel) {
            if (!lineNum.ContainsKey(panel)) {
                lineNum.Add(panel, 0);
            } else {
                lineNum[panel] = 0;
            }
        }

        void CreateUI(BasePlayer player) {

            CuiElementContainer containerMain = new CuiElementContainer();
            AccuracyData data = _allData[player.userID];

            #region main panel
            // Headers
            mainElementAccuracy = containerMain.Add(new CuiPanel {
                Image =
                {
                    Color = "0 0 0 0.5"
                },
                RectTransform =
                {
                    AnchorMin = "0.005 0.940",
                    AnchorMax = "0.200 0.960" //left digit is viewheight from left, right digit is Y axis, viewheight from bottom
                },
                CursorEnabled = false,
            }, "Hud", mainPanelAccuracyNameHeader);

            containerMain.Add(new CuiLabel {
                Text =
                                {
                        Text = "Overall Accuracy",
                        FontSize = 11,
                        Align = TextAnchor.MiddleCenter
                    },
                RectTransform =
                                {
                        AnchorMin = $"0.05 0.050",
                        AnchorMax = $"0.95 0.950"
                    }
            }, mainElementAccuracy);

            // Panels
            mainElementAccuracy = containerMain.Add(new CuiPanel {
                Image =
                {
                    Color = "0 0 0 0.5"
                },
                RectTransform =
                {
                    AnchorMin = "0.005 0.680",
                    AnchorMax = "0.200 0.937" //left digit is viewheight from left, right digit is Y axis, viewheight from bottom
                },
                CursorEnabled = false,
            }, "Hud", mainPanelAccuracyName);

            _UILineNum(mainElementAccuracy);
            double box1 = 0.070;
            AddCuiLabel(containerMain, 12, mainElementAccuracy, $"Avg Distance", 1, box1);
            AddCuiLabel(containerMain, 12, mainElementAccuracy, $"{data.distanceAvg().ToString()}m", 2, box1);
            AddCuiLabel(containerMain, 12, mainElementAccuracy, $"", 3, box1);

            AddCuiLabel(containerMain, 12, mainElementAccuracy, $"Shots", 1, box1);
            AddCuiLabel(containerMain, 12, mainElementAccuracy, $"{data.shots.ToString()}", 2, box1);
            AddCuiLabel(containerMain, 12, mainElementAccuracy, $"", 3, box1);

            AddCuiLabel(containerMain, 12, mainElementAccuracy, $"Landed", 1, box1);
            AddCuiLabel(containerMain, 12, mainElementAccuracy, $"{data.shotsLanded.ToString()}", 2, box1);
            AddCuiLabel(containerMain, 12, mainElementAccuracy, $"{data.Rate()}", 3, box1);

            AddCuiLabel(containerMain, 12, mainElementAccuracy, $"Missed", 1, box1);
            AddCuiLabel(containerMain, 12, mainElementAccuracy, $"{data.Missed().ToString()}", 2, box1);
            AddCuiLabel(containerMain, 12, mainElementAccuracy, $"{data.MissedRate()}", 3, box1);

            AddCuiLabel(containerMain, 12, mainElementAccuracy, $"", 3, box1);

            AddCuiLabel(containerMain, 12, mainElementAccuracy, $"Head", 1, box1);
            AddCuiLabel(containerMain, 12, mainElementAccuracy, $"{data.Head.ToString()}", 2, box1);
            AddCuiLabel(containerMain, 12, mainElementAccuracy, $"{data.Rate(HitArea.Head)}", 3, box1);

            AddCuiLabel(containerMain, 12, mainElementAccuracy, $"Chest", 1, box1);
            AddCuiLabel(containerMain, 12, mainElementAccuracy, $"{data.Chest.ToString()}", 2, box1);
            AddCuiLabel(containerMain, 12, mainElementAccuracy, $"{data.Rate(HitArea.Chest)}", 3, box1);

            AddCuiLabel(containerMain, 12, mainElementAccuracy, $"Stomach", 1, box1);
            AddCuiLabel(containerMain, 12, mainElementAccuracy, $"{data.Stomach.ToString()}", 2, box1);
            AddCuiLabel(containerMain, 12, mainElementAccuracy, $"{data.Rate(HitArea.Stomach)}", 3, box1);

            AddCuiLabel(containerMain, 12, mainElementAccuracy, $"Arm", 1, box1);
            AddCuiLabel(containerMain, 12, mainElementAccuracy, $"{data.Arm.ToString()}", 2, box1);
            AddCuiLabel(containerMain, 12, mainElementAccuracy, $"{data.Rate(HitArea.Arm)}", 3, box1);

            AddCuiLabel(containerMain, 12, mainElementAccuracy, $"Leg", 1, box1);
            AddCuiLabel(containerMain, 12, mainElementAccuracy, $"{data.Leg.ToString()}", 2, box1);
            AddCuiLabel(containerMain, 12, mainElementAccuracy, $"{data.Rate(HitArea.Leg)}", 3, box1);

            AddCuiLabel(containerMain, 12, mainElementAccuracy, $"Foot", 1, box1);
            AddCuiLabel(containerMain, 12, mainElementAccuracy, $"{data.Foot.ToString()}", 2, box1);
            AddCuiLabel(containerMain, 12, mainElementAccuracy, $"{data.Rate(HitArea.Foot)}", 3, box1);

            AddCuiLabel(containerMain, 12, mainElementAccuracy, $"Hand", 1, box1);
            AddCuiLabel(containerMain, 12, mainElementAccuracy, $"{data.Hand.ToString()}", 2, box1);
            AddCuiLabel(containerMain, 12, mainElementAccuracy, $"{data.Rate(HitArea.Hand)}", 3, box1);
            #endregion

            #region Buttons
            mainElementAccuracy = containerMain.Add(new CuiPanel {
                Image =
                {
                    Color = "0 0 0 0.5"
                },
                RectTransform =
                {
                    AnchorMin = "0.005 0.637",
                    AnchorMax = "0.200 0.677" //left digit is viewheight from left, right digit is Y axis, viewheight from bottom
                },
                CursorEnabled = false,
            }, "Hud", mainPanelButtons);

            CreateButton(ref containerMain, mainElementAccuracy, UIColors["buttongrey"], "Reset", 12, "0.020 0.050", "0.326 0.950", "Accuracy_ResetStats");
            CreateButton(ref containerMain, mainElementAccuracy, ShowExtraStats(player) ? UIColors["buttongreen"] : UIColors["buttonred"], "Extra Stats", 12, "0.346 0.050", "0.672 0.950", "Accuracy_ToggleExtraStats");
            CreateButton(ref containerMain, mainElementAccuracy, InfiniteAmmo(player) ? UIColors["buttongreen"] : UIColors["buttonred"], "Infinite Ammo", 12, "0.692 0.050", "0.980 0.950", "Accuracy_ToggleInfiniteAmmo");

            #endregion

            if (ShowExtraStats(player)) {
                #region 25m panel
                // 25 meters   
                AddExtraPanel(containerMain, 1, 1, "<=25m Accuracy", mainPanelAccuracyNameHeader25, mainPanelAccuracyName25, out mainElementAccuracy25);
                box1 = 0.15;

                AddCuiLabel(containerMain, 12, mainElementAccuracy25, $"Shots", 1, box1);
                AddCuiLabel(containerMain, 12, mainElementAccuracy25, $"{data.data_25m.shots.ToString()}", 2, box1);
                AddCuiLabel(containerMain, 12, mainElementAccuracy25, $"", 3, box1);

                AddCuiLabel(containerMain, 12, mainElementAccuracy25, $"Landed", 1, box1);
                AddCuiLabel(containerMain, 12, mainElementAccuracy25, $"{data.data_25m.shotsLanded.ToString()}", 2, box1);
                AddCuiLabel(containerMain, 12, mainElementAccuracy25, $"{data.data_25m.Rate()}", 3, box1);

                AddCuiLabel(containerMain, 12, mainElementAccuracy25, $"Missed", 1, box1);
                AddCuiLabel(containerMain, 12, mainElementAccuracy25, $"{data.data_25m.Missed().ToString()}", 2, box1);
                AddCuiLabel(containerMain, 12, mainElementAccuracy25, $"{data.data_25m.MissedRate()}", 3, box1);

                AddCuiLabel(containerMain, 12, mainElementAccuracy25, $"", 3, box1);

                AddCuiLabel(containerMain, 12, mainElementAccuracy25, $"Head", 1, box1);
                AddCuiLabel(containerMain, 12, mainElementAccuracy25, $"{data.data_25m.Head.ToString()}", 2, box1);
                AddCuiLabel(containerMain, 12, mainElementAccuracy25, $"{data.data_25m.Rate(HitArea.Head)}", 3, box1);
                #endregion
                #region 50m panel
                // 25 meters   
                AddExtraPanel(containerMain, 1, 2, "25-50m Accuracy", mainPanelAccuracyNameHeader50, mainPanelAccuracyName50, out mainElementAccuracy50);


                AddCuiLabel(containerMain, 12, mainElementAccuracy50, $"Shots", 1, box1);
                AddCuiLabel(containerMain, 12, mainElementAccuracy50, $"{data.data_50m.shots.ToString()}", 2, box1);
                AddCuiLabel(containerMain, 12, mainElementAccuracy50, $"", 3, box1);

                AddCuiLabel(containerMain, 12, mainElementAccuracy50, $"Landed", 1, box1);
                AddCuiLabel(containerMain, 12, mainElementAccuracy50, $"{data.data_50m.shotsLanded.ToString()}", 2, box1);
                AddCuiLabel(containerMain, 12, mainElementAccuracy50, $"{data.data_50m.Rate()}", 3, box1);

                AddCuiLabel(containerMain, 12, mainElementAccuracy50, $"Missed", 1, box1);
                AddCuiLabel(containerMain, 12, mainElementAccuracy50, $"{data.data_50m.Missed().ToString()}", 2, box1);
                AddCuiLabel(containerMain, 12, mainElementAccuracy50, $"{data.data_50m.MissedRate()}", 3, box1);

                AddCuiLabel(containerMain, 12, mainElementAccuracy50, $"", 3, box1);

                AddCuiLabel(containerMain, 12, mainElementAccuracy50, $"Head", 1, box1);
                AddCuiLabel(containerMain, 12, mainElementAccuracy50, $"{data.data_50m.Head.ToString()}", 2, box1);
                AddCuiLabel(containerMain, 12, mainElementAccuracy50, $"{data.data_50m.Rate(HitArea.Head)}", 3, box1);
                #endregion
                #region 100m panel
                // 100 meters   
                AddExtraPanel(containerMain, 1, 3, "50-100m Accuracy", mainPanelAccuracyNameHeader100, mainPanelAccuracyName100, out mainElementAccuracy100);


                AddCuiLabel(containerMain, 12, mainElementAccuracy100, $"Shots", 1, box1);
                AddCuiLabel(containerMain, 12, mainElementAccuracy100, $"{data.data_100m.shots.ToString()}", 2, box1);
                AddCuiLabel(containerMain, 12, mainElementAccuracy100, $"", 3, box1);

                AddCuiLabel(containerMain, 12, mainElementAccuracy100, $"Landed", 1, box1);
                AddCuiLabel(containerMain, 12, mainElementAccuracy100, $"{data.data_100m.shotsLanded.ToString()}", 2, box1);
                AddCuiLabel(containerMain, 12, mainElementAccuracy100, $"{data.data_100m.Rate()}", 3, box1);

                AddCuiLabel(containerMain, 12, mainElementAccuracy100, $"Missed", 1, box1);
                AddCuiLabel(containerMain, 12, mainElementAccuracy100, $"{data.data_100m.Missed().ToString()}", 2, box1);
                AddCuiLabel(containerMain, 12, mainElementAccuracy100, $"{data.data_100m.MissedRate()}", 3, box1);

                AddCuiLabel(containerMain, 12, mainElementAccuracy100, $"", 3, box1);

                AddCuiLabel(containerMain, 12, mainElementAccuracy100, $"Head", 1, box1);
                AddCuiLabel(containerMain, 12, mainElementAccuracy100, $"{data.data_100m.Head.ToString()}", 2, box1);
                AddCuiLabel(containerMain, 12, mainElementAccuracy100, $"{data.data_100m.Rate(HitArea.Head)}", 3, box1);
                #endregion
            }
            openPanels.Add(player.userID, mainElementAccuracy);

            CuiHelper.AddUi(player, containerMain);
        }
        void CreateButton(ref CuiElementContainer container, string panel, string color, string text, int size, string aMin, string aMax, string command, TextAnchor align = TextAnchor.MiddleCenter) {
            container.Add(new CuiButton {
                Button = { Color = color, Command = command, FadeIn = 0f },
                RectTransform = { AnchorMin = aMin, AnchorMax = aMax },
                Text = { Text = text, FontSize = size, Align = align }
            },
            panel);
        }
        void AddCuiLabel(CuiElementContainer container, int fontSize, string ElementName, string pText, int col, double height = 0.075) {

            string boxStart = col == 1 ? "0.05" : col == 2 ? "0.49" : "0.73";
            string boxEnd = col == 1 ? "0.47" : col == 2 ? "0.71" : "0.95";

            container.Add(new CuiLabel {
                Text =
                    {
                        Text = pText,
                        FontSize = fontSize,
                        Align = TextAnchor.MiddleLeft
                    },
                RectTransform =
                    {
                        AnchorMin = $"{boxStart} {0.95 - height*(lineNum[ElementName]+1)}",
                        AnchorMax = $"{boxEnd} {0.95 - (height*lineNum[ElementName]+0)}"
                    }
            }, ElementName);
            if (col == 3) {
                lineNum[ElementName]++;
            }
        }
        bool ShowExtraStats(BasePlayer player) {
            return _allData.ContainsKey(player.userID) && _allData[player.userID].showExtraInfo;
        }
        bool InfiniteAmmo(BasePlayer player) {
            return _allData.ContainsKey(player.userID) && _allData[player.userID].infiniteAmmo;
        }
        void AddExtraPanel(CuiElementContainer container, int col, int row, string headerText, string headerPanel, string contentPanel, out string element) {

            double headerSize = 0.020;
            double panelHeight = 0.120;
            double marginHeader = 0.005;
            double marginPanel = 0.003;

            double panelTotalSize = headerSize + panelHeight + marginHeader + marginPanel;

            double headerEnd = 0.960 - (((row - 1) * panelTotalSize));
            double headerStart = headerEnd - headerSize;

            double panelWidth = 0.195 * col;
            double panelWStart = col == 1 ? 0.205 : ((col - 1) * panelWidth);
            double panelWEnd = panelWStart + panelWidth;///col == 1 ? 0.310 : ((col - 1) * 0.310);


            double panelHEnd = headerStart - marginPanel;// panelHStart - panelHeight;
            double panelHStart = panelHEnd - panelHeight;


            element = container.Add(new CuiPanel {
                Image =
                {
                    Color = "0 0 0 0.5"
                },
                RectTransform =
                {
                    AnchorMin = $"{panelWStart} {headerStart}",
                    AnchorMax = $"{panelWEnd} {headerEnd}" //left digit is viewheight from left, right digit is Y axis, viewheight from bottom
                },
                CursorEnabled = false,
            }, "Hud", headerPanel);

            container.Add(new CuiLabel {
                Text =
                    {
                        Text = headerText,
                        FontSize = 11,
                        Align = TextAnchor.MiddleCenter
                    },
                RectTransform =
                    {
                        AnchorMin = $"0.050 0.050",
                        AnchorMax = $"0.950 0.950"
                    }
            }, element);

            element = container.Add(new CuiPanel {
                Image =
                {
                    Color = "0 0 0 0.5"
                },
                RectTransform =
                {
                    AnchorMin = $"{panelWStart} {panelHStart}",
                    AnchorMax = $"{panelWEnd} {panelHEnd}" //left digit is viewheight from left, right digit is Y axis, viewheight from bottom
                },
                CursorEnabled = false,
            }, "Hud", contentPanel);
            _UILineNum(element);
        }

        void UpdateUI(BasePlayer player) {
            DestroyUI(player);
            CreateUI(player);
        }

        void DestroyUI(BasePlayer player) {
            if (openPanels.ContainsKey(player.userID)) {
                try {
                    CuiHelper.DestroyUi(player, mainPanelAccuracyNameHeader);
                    if (ShowExtraStats(player)) {
                        CuiHelper.DestroyUi(player, mainPanelAccuracyNameHeader25);
                        CuiHelper.DestroyUi(player, mainPanelAccuracyNameHeader50);
                        CuiHelper.DestroyUi(player, mainPanelAccuracyNameHeader100);
                    }
                    CuiHelper.DestroyUi(player, mainPanelAccuracyName);
                    if (ShowExtraStats(player)) {
                        CuiHelper.DestroyUi(player, mainPanelAccuracyName25);
                        CuiHelper.DestroyUi(player, mainPanelAccuracyName50);
                        CuiHelper.DestroyUi(player, mainPanelAccuracyName100);
                    }
                    CuiHelper.DestroyUi(player, mainPanelButtons);
                } catch (Exception e) {
                }
                openPanels.Remove(player.userID);
            }
        }
        #endregion

        #region Infinite Ammo
        private void OnWeaponFired(BaseProjectile projectile, BasePlayer player) {
            if (!permission.UserHasPermission(player.UserIDString, PERMISSION_NAME) || !InfiniteAmmo(player)) return;
            if (projectile.primaryMagazine.contents > 0) return;
            projectile.primaryMagazine.contents = projectile.primaryMagazine.capacity;
            projectile.SendNetworkUpdateImmediate();
        }
        #endregion

        #region Data
        private Dictionary<string, string> UIColors = new Dictionary<string, string>
        {
            {"black", "0 0 0 1.0" },
            {"dark", "0.1 0.1 0.1 0.98" },
            {"header", "1 1 1 0.3" },
            {"light", ".564.564.564 1.0" },
            {"grey1", "0.6 0.6 0.6 1.0" },
            {"brown", "0.3 0.16 0.0 1.0" },
            {"yellow", "0.9 0.9 0.0 1.0" },
            {"orange", "1.0 0.65 0.0 1.0" },
            {"limegreen", "0.42 1.0 0 1.0" },
            {"blue", "0.2 0.6 1.0 1.0" },
            {"red", "1.0 0.1 0.1 1.0" },
            {"white", "1 1 1 1" },
            {"green", "0.28 0.82 0.28 1.0" },
            {"grey", "0.85 0.85 0.85 1.0" },
            {"lightblue", "0.6 0.86 1.0 1.0" },
            {"buttonbg", "0.2 0.2 0.2 0.7" },
            {"buttongreen", "0.133 0.965 0.133 0.9" },
            {"buttonred", "0.964 0.133 0.133 0.9" },
            {"buttongrey", "0.8 0.8 0.8 0.9" },
        };
        #endregion
    }
}

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