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

FREE VoNPC : 0.1.0 0.1.0

Нет прав для скачивания
C#:
using System;
using System.Collections.Generic;
using System.Linq;
using Oxide.Core;
using Oxide.Core.Plugins;
using UnityEngine;
using Random = System.Random;

namespace Oxide.Plugins
{
    [Info("VoNPC", "https://topplugin.ru/", "0.1.0")]
    [Description("Settings sound NPC For SoundLibrary")]
    public class VoNPC : RustPlugin
    {
        static Random random = new Random();
        [PluginReference]
        Plugin SoundLibrary;

        public NpcData npcdata;
        public class NpcData
        {
            public Dictionary<ulong,NpcAction> Npcaction = new Dictionary<ulong, NpcAction>();
        }

        public class NpcAction
        {
            public List<string> OnHit;
            public List<string> OnUse;
            public List<string> OnEnter;
            public List<string> OnLeave;
            public List<string> OnKill;
            public List<string> OnRespawn;
            public bool Type;

        }
        Dictionary<ulong,Dictionary<ulong,DateTime>> Timers = new Dictionary<ulong, Dictionary<ulong,DateTime>>();


        private void SaveNpcData() => Interface.Oxide.DataFileSystem.WriteObject(Name,npcdata);
        private void LoadNpcData() {
            try {
                npcdata = Interface.Oxide.DataFileSystem.ReadObject<NpcData>(Name);
            } catch (Exception)
            {
                npcdata = new NpcData();
            }
        }
        private class VoNpcEdit : MonoBehaviour
        {
            public BasePlayer player;
            public ulong idnpc;
            private void Awake()
            {
                player = GetComponent<BasePlayer>();
            }
        }
        private void OnServerInitialized()
        {
            if (!plugins.Find("SoundLibrary"))
            {
                PrintError("Plugin SoundLibrary not installed,Please upload plugin Sound Library");
                Interface.Oxide.UnloadPlugin(Title);
                return;
            }
            LoadNpcData();
        }

        void OnServerSave()
        {
            foreach (var pl in Timers.Keys.ToList())
            {
                foreach (var npc in Timers[pl].Keys.ToList())
                {
                    if (DateTime.Now.Subtract(Timers[pl][npc]).TotalSeconds > 10) Timers[pl].Remove(npc);
                   
                }

            }
        }

        [ChatCommand("vonpc_add")]
        void vonpcadd(BasePlayer player, string command, string[] args)
        {
            if(!player.IsAdmin) return;
             if (args.Length == 0)
             {
                 SendReply(player, "/vonpc_add ID - Add NPC");
                 return;
             }
             if(!npcdata.Npcaction.ContainsKey(ulong.Parse(args[0])))
             {
                 
                 var data = new NpcAction{            
                     OnHit = new List<string> { "" },
                     OnUse = new List<string> { "" },
                     OnEnter = new List<string> { "" },
                     OnLeave = new List<string> { "" },
                     OnKill = new List<string> { "" },
                     OnRespawn = new List<string> { "" },
                     Type = false
                 };
                 npcdata.Npcaction.Add(ulong.Parse(args[0]),data);
                 SaveNpcData();
                 var vonpcedit = player.gameObject.AddComponent<VoNpcEdit>();
                 vonpcedit.idnpc = ulong.Parse(args[0]);
                 SendReply(player, "You added NPC");

             }
        }
        [ChatCommand("vonpc")]
        void vonpc(BasePlayer player, string command, string[] args)
        {
            if(!player.IsAdmin) return;
            var vonpcedit = player.GetComponent<VoNpcEdit>();
            if (vonpcedit == null)
            {
                SendReply(player, "NPC Editor: You need to be editing an NPC, say /npc_add or /npc_edit");
                return;
            }

          
            if (args.Length == 0)
            {

                SendReply(player, "/vonpc onuse name - set sound name when player use npc");
                SendReply(player, "/vonpc onhit name - set sound name someone hiting npc");
                SendReply(player, "/vonpc onenter name - set sound name when player enter in npc radius");
                SendReply(player, "/vonpc leave name - set sound name when player leave npc radius");
                SendReply(player, "/vonpc onkill name - set sound name when player killing npc");
                SendReply(player, "/vonpc onrespawn name - set sound name when npc respawn");
                SendReply(player, "/vonpc type All/Player - set type playing for only player or for all players");
            }

            if (args.Length > 1)
            {
                switch (args[0].ToLower())
                {
                    case "onuse":
                    {
                        npcdata.Npcaction[vonpcedit.idnpc].OnUse.Add(args[1]);
                        SendReply(player,"Added sound for OnUse when down button E");
                        SaveNpcData();
                        break;
                    }
                    case "onuseclear":
                    {
                        npcdata.Npcaction[vonpcedit.idnpc].OnUse.Clear();
                        SendReply(player, "Clearing Sound for OnUse");
                        SaveNpcData();
                        break;
                    }
                    case "onhit":
                    {
                        npcdata.Npcaction[vonpcedit.idnpc].OnHit.Add(args[1]);
                            SendReply(player,"Added sound for OnHit when someone attack npc");
                        SaveNpcData();
                        break;
                    }
                    case "onhitclear":
                    {
                        npcdata.Npcaction[vonpcedit.idnpc].OnHit.Clear();
                        SendReply(player, "Clearing Sound for OnHit");
                        SaveNpcData();
                        break;
                    }
                    case "onenter":
                    {
                        npcdata.Npcaction[vonpcedit.idnpc].OnEnter.Add(args[1]);
                            SendReply(player,"Added sound for OnEnter when someone enter in npc radius");
                        SaveNpcData();
                        break;
                    }
                    case "onenterclear":
                        {
                            npcdata.Npcaction[vonpcedit.idnpc].OnEnter.Clear();
                            SendReply(player, "Clearing Sound for OnEnter");
                            SaveNpcData();
                            break;
                        }
                    case "onleave":
                    {
                        npcdata.Npcaction[vonpcedit.idnpc].OnLeave.Add(args[1]);
                            SendReply(player,"Added sound for OnLeave when someone leave from npc radius");
                        SaveNpcData();
                        break;
                    }
                    case "onleaveclear":
                        {
                            npcdata.Npcaction[vonpcedit.idnpc].OnLeave.Clear();
                            SendReply(player, "Clearing Sound for OnLeave");
                            SaveNpcData();
                            break;
                        }
                    case "onkill":
                    {
                        npcdata.Npcaction[vonpcedit.idnpc].OnKill.Add(args[1]);
                            SendReply(player,"Added sound for OnKill when someone killing npc");
                        SaveNpcData();
                        break;
                    }
                    case "onkillclear":
                        {
                            npcdata.Npcaction[vonpcedit.idnpc].OnKill.Clear();
                            SendReply(player, "Clearing Sound for OnKill");
                            SaveNpcData();
                            break;
                        }
                    case "onrespawn":
                    {
                        npcdata.Npcaction[vonpcedit.idnpc].OnRespawn.Add(args[1]);
                            SendReply(player,"Added sound for OnRespawn when npc is respawning");
                        SaveNpcData();
                        break;
                    }
                    case "onrespawnclear":
                        {
                            npcdata.Npcaction[vonpcedit.idnpc].OnRespawn.Clear();
                            SendReply(player, "Clearing Sound for OnRespawn");
                            SaveNpcData();
                            break;
                        }
                    case "type":
                    {
                        if (args[1].ToLower() == "All")
                        {
                            npcdata.Npcaction[vonpcedit.idnpc].Type = false;
                            SendReply(player, "Selected play type for all, all players will be listen around npc");
                            SaveNpcData();
                        }
                        if (args[1].ToLower() == "Player")
                        {
                            npcdata.Npcaction[vonpcedit.idnpc].Type = true;
                            SendReply(player,"Selected play type for player, only one player will be listen");
                            SaveNpcData();
                        }
                        break;
                    }
                }
            }
            
        }

        void GetRandom()
        {
            foreach (var finder in Timers)
            {
                if (finder.Key == 719)
                {
                    PrintError("Error Check");
                }
            }

        }
        [ChatCommand("vonpc_edit")]
        void vonpcedit(BasePlayer player, string command, string[] args)
        {
            if(!player.IsAdmin) return;
            if (player.GetComponent<VoNpcEdit>() != null)
            {
                SendReply(player,$"You already edit sound for npc  {player.GetComponent<VoNpcEdit>().idnpc}");
            }

            if (!npcdata.Npcaction.ContainsKey(ulong.Parse(args[0])))
            {
                SendReply(player,"Can't Find that NPC");
                
            }
            var vonpcedit = player.gameObject.AddComponent<VoNpcEdit>();
            vonpcedit.idnpc = ulong.Parse(args[0]);
            SendReply(player, $"You started edit sound for npc {vonpcedit.idnpc}");
        }
        [ChatCommand("vonpc_end")]
        private void cmdChatNPCEnd(BasePlayer player, string command, string[] args)
        {
            var vonpcedit = player.GetComponent<VoNpcEdit>();
            if (vonpcedit == null)
            {
                SendReply(player, "You already edit sound");
                return;
            }
            UnityEngine.Object.Destroy(vonpcedit);
            SendReply(player, "Edit ended");
        }

        void CheckDbTimer(ulong Uid)
        {
            if (!Timers.ContainsKey(Uid))
                Timers.Add(Uid,new Dictionary<ulong, DateTime>());
        }
void OnUseNPC(BasePlayer npc, BasePlayer player)
        {
            if(!npcdata.Npcaction.ContainsKey(npc.userID)) return;
            var NpcData = npcdata.Npcaction[npc.userID];
            int cont = random.Next(NpcData.OnUse.Count);
            CheckDbTimer(player.userID);
                if (NpcData.OnUse.Count != 0)
                {
                    if(!Timers[player.userID].ContainsKey(npc.userID))
                    {
                        Timers[player.userID].Add(npc.userID, DateTime.Now);
                        if (NpcData.Type)

                            SoundLibrary?.Call("GetSoundToPlayer", player.userID, npc.net.ID, NpcData.OnUse[cont]);
                        else
                            SoundLibrary?.Call("GetSoundToAll", npc.net.ID, NpcData.OnUse[cont]);
                    }
                    
                    if (Timers[player.userID].ContainsKey(npc.userID) && DateTime.Now.Subtract(Timers[player.userID][npc.userID]).TotalSeconds > 10)
                    {
                        
                        Timers[player.userID][npc.userID] = DateTime.Now;
                    if (NpcData.Type)
                        SoundLibrary?.Call("GetSoundToPlayer", player.userID, npc.net.ID, NpcData.OnUse[cont]);
                    else
                        SoundLibrary?.Call("GetSoundToAll", npc.net.ID, NpcData.OnUse[cont]);
                    }

                    
                }
        }

        void OnHitNPC(BasePlayer npc, HitInfo info)
        {
            if(!npcdata.Npcaction.ContainsKey(npc.userID)) return;
            var NpcData = npcdata.Npcaction[npc.userID];
            BasePlayer player = info.InitiatorPlayer;
            int cont = random.Next(NpcData.OnHit.Count);
            CheckDbTimer(player.userID);
            if (NpcData.OnHit.Count != 0)
            {
                if(!Timers[player.userID].ContainsKey(npc.userID))
                {
                    Timers[player.userID].Add(npc.userID, DateTime.Now);
                    if (NpcData.Type)
                        SoundLibrary?.Call("GetSoundToPlayer", player.userID, npc.net.ID, NpcData.OnHit[cont]);
                    else
                        SoundLibrary?.Call("GetSoundToAll", npc.net.ID, NpcData.OnHit[cont]);
                }
                
                if (Timers[player.userID].ContainsKey(npc.userID) && DateTime.Now.Subtract(Timers[player.userID][npc.userID]).TotalSeconds > 10)
                {
                        
                    Timers[player.userID][npc.userID] = DateTime.Now;
                    if (NpcData.Type)
                        SoundLibrary?.Call("GetSoundToPlayer", player.userID, npc.net.ID, NpcData.OnHit[cont]);
                    else
                        SoundLibrary?.Call("GetSoundToAll", npc.net.ID, NpcData.OnHit[cont]);
                }
                    
            }
        }

        void OnEnterNPC(BasePlayer npc, BasePlayer player)
        {
            if(!npcdata.Npcaction.ContainsKey(npc.userID)) return;
            var NpcData = npcdata.Npcaction[npc.userID];
            int cont = random.Next(NpcData.OnEnter.Count);
            CheckDbTimer(player.userID);
            if (NpcData.OnEnter.Count != 0)
            {
                if(!Timers[player.userID].ContainsKey(npc.userID))
                {
                    Timers[player.userID].Add(npc.userID, DateTime.Now);
                    if (NpcData.Type)
                        SoundLibrary?.Call("GetSoundToPlayer", player.userID, npc.net.ID, NpcData.OnEnter[cont]);
                    else
                        SoundLibrary?.Call("GetSoundToAll", npc.net.ID, NpcData.OnEnter[cont]);
                }
                
                if (Timers[player.userID].ContainsKey(npc.userID) && DateTime.Now.Subtract(Timers[player.userID][npc.userID]).TotalSeconds > 10)
                {
                        
                    Timers[player.userID][npc.userID] = DateTime.Now;
                    if (NpcData.Type)
                        SoundLibrary?.Call("GetSoundToPlayer", player.userID, npc.net.ID, NpcData.OnEnter[cont]);
                    else
                        SoundLibrary?.Call("GetSoundToAll", npc.net.ID, NpcData.OnEnter[cont]);
                }
                    

            }
        }

        void OnLeaveNPC(BasePlayer npc, BasePlayer player)
        {
            if(!npcdata.Npcaction.ContainsKey(npc.userID)) return;
            var NpcData = npcdata.Npcaction[npc.userID];
            int cont = random.Next(NpcData.OnLeave.Count);
            CheckDbTimer(player.userID);
            if (NpcData.OnLeave.Count != 0)
            {
                if(!Timers[player.userID].ContainsKey(npc.userID))
                {
                    Timers[player.userID].Add(npc.userID, DateTime.Now);
                    if (NpcData.Type)
                        SoundLibrary?.Call("GetSoundToPlayer", player.userID, npc.net.ID, NpcData.OnLeave[cont]);
                    else
                        SoundLibrary?.Call("GetSoundToAll", npc.net.ID, NpcData.OnLeave[cont]);
                }
                
                if (Timers[player.userID].ContainsKey(npc.userID) && DateTime.Now.Subtract(Timers[player.userID][npc.userID]).TotalSeconds > 10)
                {
                        
                    Timers[player.userID][npc.userID] = DateTime.Now;
                    if (NpcData.Type)
                        SoundLibrary?.Call("GetSoundToPlayer", player.userID, npc.net.ID, NpcData.OnLeave[cont]);
                    else
                        SoundLibrary?.Call("GetSoundToAll", npc.net.ID, NpcData.OnLeave[cont]);
                }
                    

            }
        }

        void OnKillNPC(BasePlayer npc, BasePlayer player)
        {
            if(!npcdata.Npcaction.ContainsKey(npc.userID)) return;
            var NpcData = npcdata.Npcaction[npc.userID];
            int cont = random.Next(NpcData.OnKill.Count);
            CheckDbTimer(player.userID);
            if (NpcData.OnKill.Count != 0)
            {
                if(!Timers[player.userID].ContainsKey(npc.userID))
                {
                    Timers[player.userID].Add(npc.userID, DateTime.Now);
                    if (NpcData.Type)
                        SoundLibrary?.Call("GetSoundToPlayer", player.userID, npc.net.ID, NpcData.OnKill[cont]);
                    else
                        SoundLibrary?.Call("GetSoundToAll", npc.net.ID, NpcData.OnKill[cont]);
                }
                
                if (Timers[player.userID].ContainsKey(npc.userID) && DateTime.Now.Subtract(Timers[player.userID][npc.userID]).TotalSeconds > 10)
                {
                    Timers[player.userID][npc.userID] = DateTime.Now;
                    if (NpcData.Type)
                        SoundLibrary?.Call("GetSoundToPlayer", player.userID, npc.net.ID, NpcData.OnKill[cont]);
                    else
                        SoundLibrary?.Call("GetSoundToAll", npc.net.ID, NpcData.OnKill[cont]);
                }
                    
            }
        }

        void OnNPCRespawn(BasePlayer npc)
        {
            NextTick(() => {
            if(!npcdata.Npcaction.ContainsKey(npc.userID)) return;
            var NpcData = npcdata.Npcaction[npc.userID];
                int cont = random.Next(NpcData.OnRespawn.Count);
                if (NpcData.OnRespawn.Count != 0)
                    SoundLibrary?.Call("GetSoundToAll", npc.net.ID, NpcData.OnRespawn[cont]);
            });
        }
    }
}

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

Другие ресурсы пользователя 15FPS

Сверху