Jump to content

FlamesFenix

Developer
  • Posts

    24
  • Joined

  • Last visited

  • Days Won

    5

File Comments posted by FlamesFenix

    SpawnNPC

       786    17

    Hello, this plugin does not spawn a ch47 (chinooklockedcrate) box in the middle of the map.
    I think your problem is something else.

    SpawnNPC

       786    17

    Hello, sorry for not writing an answer for so long, use this plugin to display markers on the map.

    using ConVar;
    using Oxide.Core;
    using Oxide.Core.Plugins;
    using System;
    using System.Collections.Generic;
    using System.Text;
    using UnityEngine;
    using VLB;
    using Color = UnityEngine.Color;
    namespace Oxide.Plugins
    {
        [Info("Marker Manager", "DezLife | mod Flames", "3.0.3")]
        public class MarkerManager : RustPlugin
        {
            #region Vars
            public static StringBuilder StringBuilderInstance;
    
            private const string genericPrefab = "assets/prefabs/tools/map/genericradiusmarker.prefab";
            private const string vendingPrefab = "assets/prefabs/deployable/vendingmachine/vending_mapmarker.prefab";
            private const string permUse = "markermanager.use";
            private const string chatCommand = "marker";
            private readonly List<CustomMapMarker> mapMarkers = new List<CustomMapMarker>();
            #endregion
    
            #region Oxide Hooks
            private void Init()
            {
                permission.RegisterPermission(permUse, this);
                cmd.AddChatCommand(chatCommand, this, nameof(cmdMarkerChat));
            }
            private void OnPlayerConnected(BasePlayer player)
            {
                foreach (CustomMapMarker marker in mapMarkers)
                {
                    if (marker != null) marker.UpdateMarkers();
                }
            }
            private void OnServerInitialized()
            {
                StringBuilderInstance = new StringBuilder();
                LoadData();
                LoadCustomMarkers();
            }
    
            private void Unload()
            {
                SaveData();
                RemoveMarkers();
                StringBuilderInstance = null;
            }
    
            #endregion
    
            #region Metods
    
            private void CreateMarker(Vector3 position, int duration, float refreshRate, string name, string displayName, float radius = 0.3f, float alpha = 0.75f, string colorMarker = "00FFFF", string colorOutline = "00FFFFFF")
            {
                CustomMapMarker marker = new GameObject().AddComponent<CustomMapMarker>();
                marker.name = name;
                marker.displayName = displayName;
                marker.radius = radius;
                marker.alpha = alpha;
                marker.position = position;
                marker.duration = duration;
                marker.refreshRate = refreshRate;
                ColorUtility.TryParseHtmlString($"#{colorMarker}", out marker.color1);
                ColorUtility.TryParseHtmlString($"#{colorOutline}", out marker.color2);
                mapMarkers.Add(marker);
            }
    
            private void CreateMarker(BaseEntity entity, int duration, float refreshRate, string name, string displayName, float radius = 0.3f, float alpha = 0.75f, string colorMarker = "00FFFF", string colorOutline = "00FFFFFF")
            {
                CustomMapMarker marker = entity.gameObject.GetOrAddComponent<CustomMapMarker>();
                marker.name = name;
                marker.displayName = displayName;
                marker.radius = radius;
                marker.alpha = alpha;
                marker.refreshRate = refreshRate;
                marker.parent = entity;
                marker.position = entity.transform.position;
                marker.duration = duration;
                ColorUtility.TryParseHtmlString($"#{colorMarker}", out marker.color1);
                ColorUtility.TryParseHtmlString($"#{colorOutline}", out marker.color2);
                mapMarkers.Add(marker);
            }
    
            private void RemoveMarker(string name)
            {
                foreach (CustomMapMarker marker in mapMarkers)
                {
                    if (marker.name != null && marker.name == name) UnityEngine.Object.Destroy(marker);
                }
            }
    
            private void RemoveMarkers()
            {
                foreach (CustomMapMarker marker in mapMarkers)
                {
                    if (marker.name != null) UnityEngine.Object.Destroy(marker);
                }
            }
            private void RemoveCustomMarker(string name, BasePlayer player = null)
            {
                int i = 0;
                foreach (CustomMapMarker marker in mapMarkers)
                {
                    if (marker.name == null || marker.placedByPlayer == false) continue;
    
                    if (marker.name == name)
                    {
                        UnityEngine.Object.Destroy(marker);
                        i++;
                    }
                }
                RemoveSavedMarker(name);
                Message(player, "Removed", i);
            }
    
            private void CreateCustomMarker(CachedMarker def, BasePlayer player = null)
            {
                CustomMapMarker marker = new GameObject().AddComponent<CustomMapMarker>();
                marker.name = def.name;
                marker.displayName = def.displayName;
                marker.radius = def.radius;
                marker.alpha = def.alpha;
                marker.position = def.position;
                marker.duration = def.duration;
                marker.refreshRate = def.refreshRate;
                marker.placedByPlayer = true;
                ColorUtility.TryParseHtmlString($"#{def.color1}", out marker.color1);
                ColorUtility.TryParseHtmlString($"#{def.color2}", out marker.color2);
                mapMarkers.Add(marker);
                if(player != null) Message(player, "Added", marker.displayName, marker.position);
            }
    
            private void SaveCustomMarker(CachedMarker def)
            {
                data.Add(def);
            }
    
            private void LoadCustomMarkers()
            {
                foreach (CachedMarker def in data)
                {
                    CreateCustomMarker(def);
                }
            }
    
            private void RemoveSavedMarker(string name)
            {
                data.RemoveAll(x => x.name == name);
            }
            #endregion
    
            #region Command
            private void cmdMarkerChat(BasePlayer player, string command, string[] args)
            {
                if (permission.UserHasPermission(player.UserIDString, permUse) == false)
                {
                    Message(player, "Permission");
                    return;
                }
    
                if (args == null || args?.Length == 0)
                {
                    Message(player, "Usage");
                    return;
                }
    
                switch (args[0].ToLower())
                {
                    default:
                        Message(player, "Usage");
                        break;
    
                    case "add":
                    case "create":
                        if (args.Length < 8)
                        {
                            Message(player, "Usage");
                        }
                        else
                        {
                            CachedMarker def = new CachedMarker
                            {
                                position = player.transform.position,
                                name = args[1],
                                duration = Convert.ToInt32(args[2]),
                                refreshRate = Convert.ToSingle(args[3]),
                                radius = Convert.ToSingle(args[4]),
                                alpha = Convert.ToSingle(args[5]),
                                displayName = args[6],
                                color1 = args[7],
                                color2 = args[8],
                            };
    
                            CreateCustomMarker(def, player);
                            SaveCustomMarker(def);
                        }
    
                        return;
    
                    case "remove":
                    case "delete":
                        if (args.Length < 2)
                        {
                            Message(player, "Usage");
                        }
                        else
                        {
                            RemoveCustomMarker(args[1], player);
                        }
    
                        return;
                }
            }
    
            #endregion
    
            #region Data 1.0.0
    
            private const string filename = "MarkerManager/Custom";
            private static List<CachedMarker> data = new List<CachedMarker>();
    
            private class CachedMarker
            {
                public float radius;
                public float alpha;
                public string color1;
                public string color2;
                public string displayName;
                public string name;
                public float refreshRate;
                public Vector3 position;
                public int duration;
            }
    
            private void LoadData()
            {
                try
                {
                    data = Interface.Oxide.DataFileSystem.ReadObject<List<CachedMarker>>(filename);
                }
                catch (Exception e)
                {
                    PrintWarning(e.Message);
                }
    
                SaveData();
                timer.Every(Core.Random.Range(500, 700f), SaveData);
            }
    
            private void SaveData()
            {
                Interface.Oxide.DataFileSystem.WriteObject(filename, data);
            }
    
            #endregion
    
            #region API
    
            private void API_CreateMarker(Vector3 position, string name, int duration = 0, float refreshRate = 3f, float radius = 0.4f, float alpha = 0.75f, string displayName = "Marker", string colorMarker = "00FFFF", string colorOutline = "00FFFFFF")
            {
                CreateMarker(position, duration, refreshRate, name, displayName, radius, alpha, colorMarker, colorOutline);
            }
    
            private void API_CreateMarker(BaseEntity entity, string name, int duration = 0, float refreshRate = 3f, float radius = 0.4f, float alpha = 0.75f, string displayName = "Marker", string colorMarker = "00FFFF", string colorOutline = "00FFFFFF")
            {
                CreateMarker(entity, duration, refreshRate, name, displayName, radius, alpha, colorMarker, colorOutline);
            }
    
            private void API_RemoveMarker(string name)
            {
                RemoveMarker(name);
            }
    
            #endregion
    
            #region Localization 1.1.1
    
            protected override void LoadDefaultMessages()
            {
                lang.RegisterMessages(new Dictionary<string, string>
                {
                    { "Usage", "<color=#00ffff>Используйте:</color>\n" + " <color=#00ffff>/marker add</color> name(code name) duration(секунды, 0 - неудолямый) refreshRate(30) radius(0.4) displayName (Названия маркера на карте) colorInline (HEX) colorOutline (HEX) - Добавить маркер на карту\n" + " <color=#00ffff>/marker remove</color> name (code name, только для маркеров созданных командой) - Удалить маркер с карты" },
                    {"Permission", "У вас недостаточно разрешений для использования этой команды!"},
                    {"Added", "Маркер '{0}' был добавлен {1}!"},
                    {"Removed", "{0} маркер(а) с таким названием были удалены!"},
                    {"RemovedOldVersion", "Вам нужно удалить плагин MarkerManager. Данные плагины не совместимы!"}
                }, this, "ru");
    
                lang.RegisterMessages(new Dictionary<string, string>
                {
                    { "Usage", "<color=#00ffff>Usage:</color>\n" + " <color=#00ffff>/marker add</color> name(code name) duration(seconds, 0 to permanent) refreshRate(30) radius(0.4) displayName (on map) colorInline (HEX) colorOutline (HEX) - Add marker on map\n" + " <color=#00ffff>/marker remove</color> name (code name, only for custom markers) - Remove marker from map" },
                    {"Permission", "You don't have permission to use that!"},
                    {"Added", "Marker '{0}' was added on {1}!"},
                    {"Removed", "{0} markers with that name was removed!"},
                    {"RemovedOldVersion", "You need to remove the MarkerManager plugin. These plugins are not compatible!"}
    
                }, this);
            }
            public string GetLang(string LangKey, string userID = null, params object[] args)
            {
                StringBuilderInstance.Clear();
                if (args != null)
                {
                    StringBuilderInstance.AppendFormat(lang.GetMessage(LangKey, this, userID), args);
                    return StringBuilderInstance.ToString();
                }
                return lang.GetMessage(LangKey, this, userID);
            }
    
            private void Message(BasePlayer player, string messageKey, params object[] args)
            {
                string message = GetLang(messageKey, player.UserIDString, args);
                player.SendConsoleCommand("chat.add", Chat.ChatChannel.Global, 0, message);
            }
    
            #endregion
    
            #region Scripts
            private class CustomMapMarker : MonoBehaviour
            {
                private VendingMachineMapMarker vending;
                private MapMarkerGenericRadius generic;
                public BaseEntity parent;
                private bool asChild;
    
                public new string name;
                public float radius;
                public float alpha;
                public Color color1;
                public Color color2;
                public string displayName;
                public float refreshRate;
                public Vector3 position;
                public int duration;
                public bool placedByPlayer;
    
    
                private void Start()
                {
                    transform.position = position;
                    asChild = parent != null;
                    CreateMarkers();
                }
    
                private void CreateMarkers()
                {
                    vending = GameManager.server.CreateEntity(vendingPrefab, position) .GetComponent<VendingMachineMapMarker>();
                    vending.markerShopName = displayName;
                    vending.enableSaving = false;
                    vending.Spawn();
    
                    generic = GameManager.server.CreateEntity(genericPrefab).GetComponent<MapMarkerGenericRadius>();
                    generic.color1 = color1;
                    generic.color2 = color2;
                    generic.radius = radius;
                    generic.alpha = alpha;
                    generic.enableSaving = false;
                    generic.SetParent(vending);
                    generic.Spawn();
    
                    if (duration != 0)
                    {
                        Invoke(nameof(DestroyMakers), duration);
                    }
    
                    UpdateMarkers();
    
                    if (refreshRate > 0f)
                    {
                        if (asChild)
                        {
                            InvokeRepeating(nameof(UpdatePosition), refreshRate, refreshRate);
                        }
                        else
                        {
                            InvokeRepeating(nameof(UpdateMarkers), refreshRate, refreshRate);
                        }
                    }
                }
    
                private void UpdatePosition()
                {
                    if (asChild == true)
                    {
                        if (parent.IsValid() == false)
                        {
                            Destroy(this);
                            return;
                        }
                        else
                        {
                            Vector3 pos = parent.transform.position;
                            transform.position = pos;
                            vending.transform.position = pos;
                        }
                    }
    
                    UpdateMarkers();
                }
    
                public void UpdateMarkers()
                {
                    vending.SendNetworkUpdate();
                    generic.SendUpdate();
                }
    
                private void DestroyMakers()
                {
                    if (vending.IsValid())
                    {
                        vending.Kill();
                    }
    
                    if (generic.IsValid())
                    {
                        generic.Kill();
                    }
                }
    
                private void OnDestroy()
                {
                    DestroyMakers();
                }
            }
            #endregion
        }
    }

     

×
×
  • Create New...