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

FREE Nations : 0.0.1 0.0.1

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

namespace Oxide.Plugins 
{
    [Info("Nations", "BodyweightEnergy", "0.0.1", ResourceId = 0)]
    public class Nations : RustPlugin
    {
        #region Cached Variables

        private const string NationDataFilename = "GovernmentData";
        private const string NationSettingsFilename = "GovernmentSettings";

        FieldInfo displayName = typeof(BasePlayer).GetField("_displayName", (BindingFlags.Instance | BindingFlags.NonPublic));

        private static Dictionary<string, Nation> nations;
        private static Dictionary<string, Nation> lookup;
        private static Dictionary<string, string> originalNames;
        private static Dictionary<string, List<string>> permissionList;
        private static List<string> RankList;
        private static Dictionary<string, Dictionary<string, float>> damageScaleTable;
        private static Dictionary<string, string> assignPermAssociation = new Dictionary<string, string> 
        {
            {"DICTATOR","modify_dictator"}, 
            {"HEAD", "modify_head"},
            {"BOOT", "modify_boot"},
            {"WORKER", "modify_worker"},
            {"CITIZEN", "modify_citizen"}
        };
        

        #endregion

        #region Data Management

        public void SaveData()
        {
            var data = Interface.GetMod().DataFileSystem.GetDatafile(NationDataFilename);
            var settings = Interface.GetMod().DataFileSystem.GetDatafile(NationSettingsFilename);
            // Saving Rank List Data
            var rankData = new List<object>();
            foreach (var rank in RankList) rankData.Add(rank);
            settings["ranks"] = rankData;

            // Saving Permission Data
            var permissionsData = new Dictionary<string, object>();
            foreach (var permission in permissionList)
            {
                var permitList = new List<object>();
                foreach (var rank in permission.Value) permitList.Add(rank);
                permissionsData.Add(permission.Key, permitList);
            }
            settings["permissions"] = permissionsData;

            // Saving Damage Scale Data
            // TODO

            // Saving Government Data
            var nationsData = new Dictionary<string, object>();
            foreach (var nation in nations)
            {
                var nationData = new Dictionary<string, object>();
                nationData.Add("name", nation.Value.Name);
                var members = new Dictionary<string, object>();
                foreach (var imember in nation.Value.Members)
                    members.Add(imember.Key, imember.Value);
                var guests = new List<object>();
                foreach (var iguest in nation.Value.Guests)
                    guests.Add(iguest);
                var inviteds = new List<object>();
                foreach (var iinvited in nation.Value.Inviteds)
                    inviteds.Add(iinvited);
                nationData.Add("members", members);
                nationData.Add("guests", guests);
                nationData.Add("inviteds", inviteds);
                nationsData.Add(nation.Key, nationData);
            }
            data["governments"] = nationsData;
            Interface.GetMod().DataFileSystem.SaveDatafile(NationDataFilename);
            Interface.GetMod().DataFileSystem.SaveDatafile(NationSettingsFilename);
        }

        public void LoadData()
        {
            nations.Clear();
            lookup.Clear();
            RankList.Clear();
            permissionList.Clear();
            var data = Interface.GetMod().DataFileSystem.GetDatafile(NationDataFilename);
            var settings = Interface.GetMod().DataFileSystem.GetDatafile(NationSettingsFilename);

            // Load Rank List
            if (settings["ranks"] != null)
            {
                var rankList = (List<object>)Convert.ChangeType(settings["ranks"], typeof(List<object>));
                foreach (var irank in rankList) 
                { 
                    RankList.Add((string)irank); 
                }
            }

            // Load Permissions List
            if (settings["permissions"] != null)
            {
                var permissionData = (Dictionary<string, object>)Convert.ChangeType(settings["permissions"], typeof(Dictionary<string, object>));
                foreach (var ipermission in permissionData)
                {
                    var permitList = (List<object>)Convert.ChangeType(ipermission.Value, typeof(List<object>));
                    var newPermitList = new List<string>();
                    foreach (var permit in permitList) newPermitList.Add((string)permit);
                    permissionList.Add(ipermission.Key, newPermitList);
                }
            }
            else
            {

            }

            // Load Damage Scale Types Table
            if(settings["damageScales"] != null)
            {
                var damageScaleData = (Dictionary<string, object>)Convert.ChangeType(settings["damageScales"], typeof(Dictionary<string, object>));
                foreach(var attackerData in damageScaleData)
                {
                    var attackerRank = attackerData.Key;
                    var victimData = (Dictionary<string, object>)attackerData.Value;
                    var victims = new Dictionary<string, float>();
                    foreach(var victim in victimData)
                    {
                        var victimRank = victim.Key;
                        var damageScaleValue = (float) Convert.ChangeType(victim.Value, typeof(float));
                        victims.Add(victimRank, damageScaleValue);
                    }
                    damageScaleTable.Add(attackerRank, victims);
                }
            }
            else
            {

            }

            // Load Government Data
            if (data["governments"] != null)
            {
                var govsData = (Dictionary<string, object>)Convert.ChangeType(data["governments"], typeof(Dictionary<string, object>));
                foreach (var igov in govsData)
                {
                    var gov = (Dictionary<string, object>)igov.Value;
                    var tag = (string)igov.Key;
                    var name = (string)gov["name"];
                    var membersData = (Dictionary<string, object>)gov["members"];
                    var members = new Dictionary<string, string>();
                    foreach (var imember in membersData)
                    {
                        var memberID = (string)imember.Key;
                        var memberRank = (string)imember.Value;
                        members.Add(memberID, memberRank);
                    }
                    var guestsData = (List<object>)gov["guests"];
                    var guests = new List<string>();
                    foreach (var iguest in guestsData)
                    {
                        guests.Add(iguest.ToString());
                    }
                    var invitedsData = (List<object>)gov["inviteds"];
                    var inviteds = new List<string>();
                    foreach (var iinvited in invitedsData)
                    {
                        inviteds.Add(iinvited.ToString());
                    }
                    var newGov = new Nation() { Tag = tag, Name = name};
                    foreach (var m in members) newGov.AddMember(m.Key, m.Value);
                    newGov.Guests = guests;
                    newGov.Inviteds = inviteds;
                    nations.Add(tag, newGov);
                }
            }
            Puts("Successfully loaded (" + nations.Count + ") governments.");

        }


        #endregion //Data Management

        #region Plugin Methods

        private bool nationNameExists(string name)
        {
            var exists = false;
            foreach (var gov in nations)
            {
                if (gov.Value.Name == name)
                {
                    exists = true;
                }
            }
            return exists;
        }
        public static string Rank(string rank_str)
        {
            if (RankList.Contains(rank_str))
            {
                return rank_str;
            }
            throw (new Exception("Attempted to assign invalid rank \"" + rank_str + "\"."));
            return null;
        }
        public Nation getNationByUserID (string playerId)
        {
            if (nations.ContainsKey(playerId))
            {
                return nations[playerId];
            }
            return null;
        }
        private string GetRank(string playerId)
        {
            return lookup[playerId].Members[playerId];
        }
        public bool isMemberOfNation (string playerId, string tag)
        {
            return (nations[tag].isMember(playerId));
        }
        public bool isGuestOfNation (string playerId, string tag)
        {
            return (nations[tag].isGuest(playerId));
        }
        public bool isInvitedOfNation(string playerId, string tag)
        {
            return (nations[tag].isInvited(playerId));
        }

        private BasePlayer FindPlayerByPartialName(string name)
        {
            if (string.IsNullOrEmpty(name))
                return null;
            BasePlayer player = null;
            name = name.ToLower();
            var allPlayers = BasePlayer.activePlayerList.ToArray();
            // Try to find an exact match first
            foreach (var p in allPlayers)
            {
                if (p.displayName == name)
                {
                    if (player != null)
                        return null; // Not unique
                    player = p;
                }
            }
            if (player != null)
                return player;
            // Otherwise try to find a partial match
            foreach (var p in allPlayers)
            {
                if (p.displayName.ToLower().IndexOf(name) >= 0)
                {
                    if (player != null)
                        return null; // Not unique
                    player = p;
                }
            }
            return player;
        }
        private string StripTag(string name, Nation nation)
        {
            if (nation == null)
                return name;
            var re = new Regex(@"^\[" + nation.Tag + @"\]\s");
            while (re.IsMatch(name))
                name = name.Substring(nation.Tag.Length + 3);

            Puts("StripTag result = " + name);
            return name;
        }
        public static string FindPlayerNameByID(string playerId)
        {
            var player = BasePlayer.FindByID(Convert.ToUInt64(playerId));
            if (player == null) return "NULL";
            else return player.displayName;
        }

        private bool HasPermission(string playerId, string permissionType)
        {
            if (lookup.ContainsKey(playerId)) 
            {
                var memberRank = lookup[playerId].Members[playerId];
                if (permissionList[permissionType] != null)
                {
                    if (permissionList[permissionType].Contains(memberRank))
                    {
                        return true;
                        Puts("Player " + playerId + " has permission to " + permissionType + ".");
                    }
                }
            }
            return false;
        }

        private void SetupPlayer(BasePlayer player)
        {
            var prevName = player.displayName;
            var playerId = player.userID.ToString();
            var gov = getNationByUserID(playerId);
            displayName.SetValue(player, StripTag(player.displayName, gov));
            if (gov == null)
            {
                return;
            }
            else
            {
                var tag = "[" + gov.Tag + "] ";
                if (!player.displayName.StartsWith(tag))
                    displayName.SetValue(player, tag + prevName);
            }
            if (player.displayName != prevName)
                player.SendNetworkUpdate();
        }
        private void SetupPlayers(List<string> playerIds)
        {
            foreach (var playerId in playerIds)
            {
                var uid = Convert.ToUInt64(playerId);
                var player = BasePlayer.FindByID(uid);
                if (player != null)
                    SetupPlayer(player);
                else
                {
                    player = BasePlayer.FindSleeping(uid);
                    if (player != null)
                        SetupPlayer(player);
                }
            }
        } 

        private void CreateNation(string tag, string name, string creatorID)
        {
            var newGov = new Nation() { Tag = tag, Name = name };
            nations.Add(tag, newGov);
            newGov.AddMember(creatorID, Rank("DICTATOR"));
        }
        private void DisbandNation (string tag)
        {
            if(nations.ContainsKey(tag))
            {
                nations.Remove(tag);
            }
        }

        #endregion

        #region Server & Plugin Hooks

        [HookMethod("OnServerInitialized")]
        private void OnServerInitialized()
        {
            try
            {
            }
            catch (Exception ex)
            {
                Error("OnServerInitialized failed", ex);
            }
        }

        [HookMethod("OnPluginLoaded")]
        private void OnPluginLoaded()
        {
            try
            {
                lookup = new Dictionary<string, Nation>();
                nations = new Dictionary<string, Nation>();
                permissionList = new Dictionary<string, List<string>>();
                RankList = new List<string>();
                damageScaleTable = new Dictionary<string, Dictionary<string, float>>();
                LoadData();
            }
            catch (Exception ex)
            {
                Error("OnPluginLoaded failed ", ex);
            }
        }

        [HookMethod("OnServerSave")]
        private void OnServerSave()
        {
            try
            {
                SaveData();
            }
            catch (Exception ex)
            {
                Error("OnServerSave failed", ex);
            }
        }

        [HookMethod("OnPluginUnloaded")]
        private void OnPluginUnloaded()
        {
            try
            {
                SaveData();
            }
            catch (Exception ex)
            {
                Error("OnPluginLoaded failed", ex);
            }
        }

        [HookMethod("OnEntityTakeDamage")]
        private void OnEntityTakeDamage(BaseCombatEntity entity, HitInfo hitInfo)
        {
            try
            {
                float damageScale = 1.0f;
                var sb = new StringBuilder();
                if (entity as BasePlayer == null || hitInfo == null) return;
                var attackerPlayer = hitInfo.Initiator as BasePlayer;
                var victimPlayer = entity as BasePlayer;
                var victimID = victimPlayer.userID.ToString();
                var attackerID = attackerPlayer.userID.ToString();
                if (lookup.ContainsKey(attackerID) && lookup.ContainsKey(victimID))
                {
                    var attackerGov = lookup[attackerID];
                    var victimGov = lookup[victimID];
                    if (attackerGov == victimGov)
                    {
                        var attackerRank = attackerGov.Members[attackerID];
                        var victimRank = victimGov.Members[victimID];
                        damageScale = damageScaleTable[attackerRank][victimRank];
                        hitInfo.damageTypes.ScaleAll(damageScale);
                        //sb.Append(attackerID + " attacked " + victimID + 
                        //    " and caused " + damageScale.ToString() + " damage scale of type " + hitInfo.damageTypes.GetMajorityDamageType().ToString());
                    }
                }
                SendReply(hitInfo.Initiator as BasePlayer, sb.ToString());
            } catch (NullReferenceException ex)
            {

            }
        }

        #endregion 

        #region Console Commands

        [ConsoleCommand("gov.dump")]
        private void cmdConsoleDumpData(ConsoleSystem.Arg arg)
        {
            var sb = new StringBuilder();
            SaveData();
            LoadData();
            // Dump Message Header
            sb.Append("**** Dumping Government Data & Settings ****\n\n");
            // Rank List Dump
            sb.Append("Rank List = [");
            foreach (var rank in RankList)
            {
                sb.Append(rank + ", ");
            }
            sb.Append("]\n\n");
            // Permission List Dump
            sb.Append("Permission List:\n");
            foreach(var perm in permissionList)
            {
                sb.Append(perm.Key + " = [");
                foreach(var rank in perm.Value)
                {
                    sb.Append(rank + ", ");
                }
                sb.Append("]\n");
            }
            sb.Append("\n");
            // Governments Data Dump
            sb.Append("Governments Data:\n\n");
            foreach(var gov in nations)
            {
                sb.Append("[" + gov.Key + "] " + gov.Value.Name + "\n");
                foreach(var member in gov.Value.Members) sb.Append(member.Key + "\t" + member.Value + "\t" + FindPlayerNameByID(member.Key) + "\n");
                foreach (var guest in gov.Value.Guests) sb.Append(guest + "\tGUEST\t" + FindPlayerNameByID(guest) + "\n");
                foreach (var invited in gov.Value.Inviteds) sb.Append(invited + "\tINVITED\t" + FindPlayerNameByID(invited) + "\n");
                {

                }
            }
                sb.Append("\n");
            // Lookup Data Dump
                sb.Append("Lookup Data:\n");
            foreach(var pair in lookup)
            {
                sb.Append(pair.Key + "\t" + pair.Value.Tag + "\t" + pair.Value.Members[pair.Key] +"\t"+ FindPlayerNameByID(pair.Key) + "\n");
            }
            
            PrintToConsole(arg.Player(), sb.ToString());
        }

        #endregion

        #region Chat Commands

        [ChatCommand("gov_create")]
        private void cmdChatGovCreate(BasePlayer player, string command, string[] args)
        {
            var sb = new StringBuilder();
            var playerId = player.userID.ToString();
            if(args.Length != 2)
            {
                sb.Append("Invalid command.Type /gov_help for more info.");
            }
            else if (lookup.ContainsKey(playerId))
            {
                sb.Append("You are already a member of a government.");
            }
            else if (nations.ContainsKey(args[0]))
            {
                sb.Append("This tag has already been taken.Try another tag.");
            }
            else if (nationNameExists(args[1]))
            {
                sb.Append("This name has already been taken.Try another name.");
            }
            else
            {
                CreateNation(args[0], args[1], player.userID.ToString());
                sb.Append("You have successfully created the " + args[1] + " government, and you are the dictator of it.");
            }
            SendReply(player, sb.ToString());
            SaveData();
        }

        [ChatCommand("gov_invite")]
        private void cmdChatGovInvite(BasePlayer player, string command, string[] args)
        {
            var sb = new StringBuilder();
            var playerId = player.userID.ToString();
            if (args.Length != 1)
            {
                sb.Append("Invalid command.Type /gov_help for more info.");
            }
            else if (!lookup.ContainsKey(playerId))
            {
                sb.Append("You are not a member of any government.");
            }
            else if (!HasPermission(playerId, "modify_citizen"))
            {
                sb.Append("You do not have permission to invite.");
            }
            else
            {
                var invitedPlayer = FindPlayerByPartialName(args[0]);
                var invitedID = invitedPlayer.userID.ToString();
                var invitingGov = lookup[playerId];
                if (invitingGov.Inviteds.Contains(invitedID)) sb.Append("You already invited this player.");
                else
                {
                    invitingGov.Inviteds.Add(invitedID);
                    sb.Append("You have invited " + invitedPlayer.displayName + " to join your domain.");
                    sb.Append(" They must leave their existing government first (if they are a member of one)");
                    sb.Append(", then type \"/gov_join " + invitingGov.Tag + "\" to join yours.");
                    SendReply(invitedPlayer, "You have been invited to become a citizen in the " + invitingGov.Name + ".To join, you must leave any government you are part of, then type /gov_join " + invitingGov.Tag + ".");
                }
            }
            SendReply(player, sb.ToString());
            SaveData();
        }

        [ChatCommand("gov_uninvite")]
        private void cmdChatGovUninvite(BasePlayer player, string command, string[] args)
        {
            var sb = new StringBuilder();
            var playerId = player.userID.ToString();
            if (args.Length != 1)
            {
                sb.Append("Invalid command.Type /gov_help for more info.");
            }
            else if (!lookup.ContainsKey(playerId))
            {
                sb.Append("You are not a member of any government.");
            }
            else if (!HasPermission(playerId, "modify_citizen"))
            {
                sb.Append("You do not have permission to invite.");
            }
            else
            {
                var invitedPlayer = FindPlayerByPartialName(args[0]);
                var invitedID = invitedPlayer.userID.ToString();
                var invitingGov = lookup[playerId];
                if (!invitingGov.Inviteds.Contains(invitedID)) sb.Append("This player is already not invited to join your government.");
                else
                {
                    invitingGov.Inviteds.Remove(invitedID);
                    sb.Append("You have withdrawn your invitation for " + invitedPlayer.displayName + " to join your domain.");
                    SendReply(invitedPlayer, "The invitation to join the " + invitingGov.Name + " has been withdrawn.");
                }
            }
            SendReply(player, sb.ToString());
            SaveData();
        }

        [ChatCommand("gov_kick")]
        private void cmdChatGovKick(BasePlayer player, string command, string[] args)
        {
            var sb = new StringBuilder();
            var playerId = player.userID.ToString();
            if (args.Length != 1)
            {
                sb.Append("Invalid command.Type /gov_help for more info.");
            }
            else if (!lookup.ContainsKey(playerId))
            {
                sb.Append("You are not a member of any government.");
            }
            else
            {
                var kickedPlayer = FindPlayerByPartialName(args[0]);
                var kickedPlayerName = kickedPlayer.displayName;
                var kickedPlayerID = kickedPlayer.userID.ToString();
                if (kickedPlayer != null)
                {
                    if (!lookup.ContainsKey(kickedPlayerID)) sb.Append("This player is not a member of your domain.");
                    else if (lookup[kickedPlayerID] != lookup[playerId]) sb.Append("This player is not a member of your domain.");
                    else
                    {
                        var kickedPlayerRank = GetRank(kickedPlayerID);
                        var permission = assignPermAssociation[kickedPlayerRank];
                        if (!HasPermission(playerId, permission))
                        {
                            sb.Append("You do not have permission to kick this player.");
                        }
                        else
                        {
                            lookup[playerId].RemoveMember(kickedPlayerID);
                            sb.Append("You have successfully kicked " + kickedPlayerName + " from your government.");
                            lookup[playerId].Broadcast(kickedPlayerName + " has been banished from the " + lookup[playerId].Name + " government.");
                            SendReply(kickedPlayer, "You have been banished from the " + lookup[playerId].Name + " government.");
                        }
                    }
                }
                else sb.Append("Player name does not exist or isn't unique.");
            }
            SendReply(player, sb.ToString());
            SaveData();
        }

        [ChatCommand("gov_assign_rank")]
        private void cmdChatGovAssignRank(BasePlayer player, string command, string[] args)
        {
            var sb = new StringBuilder();
            var playerId = player.userID.ToString();
            if (args.Length != 2)
            {
                sb.Append("Invalid command.Type /gov_help for more info.");
            }
            else if (!lookup.ContainsKey(playerId))
            {
                sb.Append("You are not a member of any government.");
            }
            else
            {
                var assignedPlayer = FindPlayerByPartialName(args[0]).userID.ToString();
                var assignedPlayerName = FindPlayerByPartialName(args[0]).displayName;
                var assignedRank = Rank(args[1]);
                if (assignedPlayer == null) sb.Append("Player name does not exist or is not unique.");
                else if (lookup[assignedPlayer] != lookup[playerId]) sb.Append("The player is not a member of your government.");
                else if (!HasPermission(playerId, assignPermAssociation[assignedRank])) sb.Append("You do not have permission to " + assignPermAssociation[assignedRank] + ".");
                else
                {
                    lookup[playerId].Members[assignedPlayer] = assignedRank;
                    sb.Append(assignedPlayerName + " has been successfully assigned as " + assignedRank + ".");
                }

            }
            SendReply(player, sb.ToString());
            SaveData();
        }

        [ChatCommand("gov_join")]
        private void cmdChatGovJoin(BasePlayer player, string command, string[] args)
        {
            var sb = new StringBuilder();
            var playerId = player.userID.ToString();
            if (args.Length != 1)
            {
                sb.Append("Invalid command.Type /gov_help for more info.");
            }
            else if (lookup.ContainsKey(playerId))
            {
                sb.Append("To join another government, you must leave this one first by typing");
                sb.Append(" \"/gov_leave\".");
            }
            else if(!nations.ContainsKey(args[0]))
            {
                sb.Append("No such government exists.");
            }
            else if (!nations[args[0]].isInvited(playerId))
            {
                sb.Append("You were not invited to join this government.Make sure a permitted member of that government has already invited you.");
            }
            else
            {
                var invitingGov = nations[args[0]];
                invitingGov.AddMember(playerId, Rank("CITIZEN"));
                invitingGov.Inviteds.Remove(playerId);
                sb.Append("You are now a " + GetRank(playerId) + " of the " + lookup[playerId].Name + " government.");
            }
            SendReply(player, sb.ToString());
            SaveData();
        }

        [ChatCommand("gov_leave")]
        private void cmdChatGovLeave(BasePlayer player, string command, string[] args)
        {
            var sb = new StringBuilder();
            var playerId = player.userID.ToString();
            if (args.Length != 0)
            {
                sb.Append("Invalid command.Type /gov_help for more info.");
            }
            else if (!lookup.ContainsKey(playerId))
            {
                sb.Append("You are not a member of any governments.");
            }
            else
            {
                var leftGov = lookup[playerId];
                leftGov.RemoveMember(playerId);
                sb.Append("You are no longer a member of the " + leftGov.Name + " government.");
                leftGov.Broadcast(FindPlayerNameByID(playerId) + " has left the " + leftGov.Name + " government.");
            }
            SendReply(player, sb.ToString());
            SaveData();
        }

        [ChatCommand("gov_broadcast")]
        private void cmdChatGovBroadcast(BasePlayer player, string command, string[] args)
        {
            var sb = new StringBuilder();
            var playerId = player.userID.ToString();
            if (args == null)
            {
                sb.Append("Invalid command.Type /gov_help for more info.");
            }
            else if (!HasPermission(playerId, "broadcast_all")) sb.Append("You do not have permission to broadcast.");
            else
            {
                var bsb = new StringBuilder();
                foreach(var arg in args)
                {
                    bsb.Append(arg + " ");
                }
                lookup[playerId].Broadcast(bsb.ToString());
                sb.Append("Broadcast sent successfully.");
            }
            SendReply(player, sb.ToString());
            SaveData();
        }

        [ChatCommand("gov_info")]
        private void cmdChatGovInfo(BasePlayer player, string command, string[] args)
        {
            var sb = new StringBuilder();
            var playerId = player.userID.ToString();
            if (args.Length != 0)
            {
                sb.Append("Invalid command.Type /gov_help for more info.");
            }
            else if(!lookup.ContainsKey(playerId))
            {
                sb.Append("You are not a member of any government.");
            }
            else
            {
                var gov = lookup[playerId];
                sb.Append("Your Government's Info:\n");
                sb.Append("[" + gov.Tag + "] " + gov.Name + "\n");
                var sortedList = gov.GetSortedMemberList();
                foreach (var member in sortedList) sb.Append(member.Key + "\t" + member.Value + "\t" + FindPlayerNameByID(member.Key) + "\n");
                foreach (var guest in gov.Guests) sb.Append(guest + "\tGUEST\t" + FindPlayerNameByID(guest) + "\n");
                foreach (var invited in gov.Inviteds) sb.Append(invited + "\tINVITED\t" + FindPlayerNameByID(invited) + "\n");      
            }
            SendReply(player, sb.ToString());
            SaveData();
        }

        [ChatCommand("gov_help")]
        private void cmdChatGovHelp(BasePlayer player, string command, string[] args)
        {
            var sb = new StringBuilder();
            sb.Append("Available Commands:\n");
            sb.Append("<color=#ffd479>/gov_create <GOV TAG> <GOV NAME></color>\n");
            sb.Append("<color=#ffd479>/gov_invite <PARTIAL PLAYER NAME></color>\n");
            sb.Append("<color=#ffd479>/gov_join <GOV TAG></color>\n");
            sb.Append("<color=#ffd479>/gov_assign_rank <PARTIAL PLAYER NAME> <RANK></color>\n");
            sb.Append("<color=#ffd479>/gov_kick <PARTIAL PLAYER NAME></color>\n");
            sb.Append("<color=#ffd479>/gov_leave</color>\n");
            sb.Append("<color=#ffd479>/gov_broadcast <MESSAGE></color>\n");
            sb.Append("<color=#ffd479>/gov_info</color>\n");
            SendReply(player, sb.ToString());
            SaveData();
        }

        #endregion

        #region class Nation

        public class Nation
        {
            // Private Members
            public string Tag { get; set; }
            public string Name { get; set; }
            public Dictionary<string, string> Members { get; set; }
            public List<string> Guests { get; set; }
            public List<string> Inviteds { get; set; }
            // Properties
            public string Dictator
            {
                get
                {
                    foreach (var member in Members)
                    {
                        if(member.Value == "DICTATOR")
                        {
                            return member.Key;
                        }
                    }
                    return null;
                }
                set
                {
                    var newCrownId = value;
                    bool crownExists = false;
                    foreach(var member in Members)
                    {
                        if (member.Value == "DICTATOR")
                        {
                            crownExists = true;
                        }
                    }
                    if(!crownExists)
                    {
                        Members[newCrownId] = "DICTATOR";
                    }
                }
            }
            // Default Constructor
            public Nation ()
            {
                Members = new Dictionary<string, string>();
                Guests = new List<string>();
                Inviteds = new List<string>();
            }
            // Methods
            public bool isMember(string playerId)
            {
                return (Members.ContainsKey(playerId) && lookup.ContainsKey(playerId));
            }
            public bool isGuest(string playerId)
            {
                return (Guests.Contains(playerId));
            }
            public bool isInvited (string playerId)
            {
                return (Inviteds.Contains(playerId));
            }

            public void AddMember(string playerId, string rank)
            {
                if (!isMember(playerId) || !lookup.ContainsKey(playerId))
                {
                    Members.Add(playerId, Rank(rank));
                    lookup.Add(playerId, this);
                }
            }
            public void ModifyMember(string playerId, string rank)
            {
                if (isMember(playerId) && lookup.ContainsKey(playerId))
                {
                    Members[playerId] = rank;
                }
            }
            public void RemoveMember (string playerId)
            {
                if (isMember(playerId) && lookup.ContainsKey(playerId))
                {
                    Members.Remove(playerId);
                    lookup.Remove(playerId);
                }
            }

            public List<KeyValuePair<string,string>> GetSortedMemberList()
            {
                List<KeyValuePair<string, string>> myList = Members.ToList();

                myList.Sort((firstPair, nextPair) =>
                {
                    return firstPair.Value.CompareTo(nextPair.Value);
                }
                );
                return myList;
            }

            public void Broadcast(string message)
            {
                string message_header = "<color=#a1ff46>(GOV BROADCAST)</color> ";

                // Send message to members
                foreach (var member in Members)
                {
                    var player = BasePlayer.FindByID(Convert.ToUInt64(member.Key));
                    if (player == null)
                        continue;
                    player.SendConsoleCommand("chat.add", "", message_header + message);
                }

            }
        }

        #endregion

        #region Utility Methods

        private void Log(string message) {
            Interface.Oxide.LogInfo("{0}: {1}", Title, message);
        }

        private void Warn(string message) {
            Interface.Oxide.LogWarning("{0}: {1}", Title, message);
        }

        private void Error(string message, Exception ex = null) {
            if (ex != null)
                Interface.Oxide.LogException(string.Format("{0}: {1}", Title, message), ex);
            else
                Interface.Oxide.LogError("{0}: {1}", Title, message);
        }

        #endregion

        #region Settings Defaults

        //private const Dictionary<string, Dictionary<string, float>> damageScaleTable_default = 
        //{

        //};

        #endregion
    }
}

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