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

FREE PoliticalSurvival : 0.2 0.2

Нет прав для скачивания
C#:
// Все права принадлежат дискорд сообществу https://discord.gg/VgNHPpNrz6
// Reference: MySql.Data

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using MySql.Data;
using MySql.Data.MySqlClient;
using MySql.Data.Common;
using UnityEngine;

namespace Oxide.Plugins
{
    [Info("PoliticalSurvival", "Jonty", 0.2)]
    [Description("Political Survival - Become the President, tax your subjects and keep them in line!")]
    class PoliticalSurvival : RustPlugin
    {
        static void Main(string[] args) { }

        public class StrayPlayer
        {
            public ulong SteamId;
            public bool IsSettingTaxChest;

            public StrayPlayer(ulong pSteamId)
            {
                this.SteamId = pSteamId;
                this.IsSettingTaxChest = false;
            }
        }

        Dictionary<BasePlayer, StrayPlayer> OnlinePlayers;
        Dictionary<string, string> ServerMessages;

        MySqlConnection Database;

        string DatabaseHost = "";
        string DatabasePort = "";
        string DatabaseUsername = "";
        string DatabasePassword = "";
        string DatabaseName = "";

        ulong President = 0;
        double TaxLevel = 20.0;
        string RealmName = "";

        float TaxChestX = 0;
        float TaxChestY = 0;
        float TaxChestZ = 0;

        StorageContainer TaxContainer = null;

        private void LoadDefaultConfig()
        {
            CreateConfigEntry("Database", "Host", "127.0.0.1");
            CreateConfigEntry("Database", "Port", "3306");
            CreateConfigEntry("Database", "Username", "root");
            CreateConfigEntry("Database", "Password", "lol123");
            CreateConfigEntry("Database", "Name", "rust");

            SaveConfig();
        }

        void Init()
        {
            DatabaseHost = Config["Database", "Host"].ToString();
            DatabasePort = Config["Database", "Port"].ToString();
            DatabaseUsername = Config["Database", "Username"].ToString();
            DatabasePassword = Config["Database", "Password"].ToString();
            DatabaseName = Config["Database", "Name"].ToString();
            RealmName = lang.GetMessage("DefaultRealm", this);

            Puts("Political Survival is starting...");

            OnlinePlayers = new Dictionary<BasePlayer, StrayPlayer>();
            LoadServerMessages();

            try
            {
                Database = new MySqlConnection();
                Database.ConnectionString = "server=" + DatabaseHost + ";port=" + DatabasePort + ";uid=" + DatabaseUsername + ";pwd=" + DatabasePassword + ";database=" + DatabaseName + ";";
                Database.Open();

                MySqlCommand GetSettings = new MySqlCommand("SELECT president,tax_level,realm_name,tax_chest FROM settings LIMIT 1", Database);
                MySqlDataReader SettingsReader = GetSettings.ExecuteReader();

                while (SettingsReader.Read())
                {
                    President = SettingsReader.GetUInt64(0);
                    TaxLevel = SettingsReader.GetInt32(1);
                    RealmName = SettingsReader.GetString(2);

                    string[] TaxCoordinates = SettingsReader.GetString(3).Split(';');
                    TaxChestX = Convert.ToSingle(TaxCoordinates[0]);
                    TaxChestY = Convert.ToSingle(TaxCoordinates[1]);
                    TaxChestZ = Convert.ToSingle(TaxCoordinates[2]);				
                }

                SettingsReader.Dispose();
                GetSettings.Dispose();
            }
            catch (Exception e)
            {
                PrintToConsole(e.ToString());
                PrintToConsole("If this is the first time running the plugin, please edit the configuration!");
            }
         
            Puts("Realm name is " + RealmName);
            Puts("Tax level is " + TaxLevel);
            Puts("President is " + President);

            LoadTaxContainer();

            if (BasePlayer.activePlayerList.Count >= 1)
            {
                foreach (BasePlayer iPlayer in BasePlayer.activePlayerList)
                {
                    AddPlayer(iPlayer);
                }

                Puts(OnlinePlayers.Count + " players cached.");
            }

            Puts("Political Survival: Started");
        }

        void OnPlayerInit(BasePlayer Player)
        {
            PrintToChat(Player.displayName + " " + lang.GetMessage("PlayerConnected", this, Player.UserIDString) + " " + RealmName);
            AddPlayer(Player);
        }

        void OnPlayerDisconnected(BasePlayer Player, string Reason)
        {
            PrintToChat(Player.displayName + " " + lang.GetMessage("PlayerDisconnected", this, Player.UserIDString) + " " + RealmName);
            RemovePlayer(Player);
        }

        void OnDispenserGather(ResourceDispenser Dispenser, BaseEntity Entity, Item Item)
        {
            if (TaxLevel > 0 && President > 0)
            {
                int Tax = Convert.ToInt32(Math.Round((Item.amount * TaxLevel) / 100));
                Item.amount = Item.amount - Tax;

                if (TaxContainer == null)
                {
                    TaxChestX = 0;
                    TaxChestY = 0;
                    TaxChestZ = 0;
                    SaveTaxContainer();
                    LoadTaxContainer();
                    return;
                }

                if (!TaxContainer.inventory.IsFull())
                {
                    ItemDefinition ToAdd = ItemManager.FindItemDefinition(Item.info.itemid);

                    if (ToAdd != null)
                    {
                        TaxContainer.inventory.AddItem(ToAdd, Tax);
                    }
                }
            }
        }

        void OnPlantGather(PlantEntity Plant, Item Item, BasePlayer Player)
        {
            int Tax = Convert.ToInt32(Math.Round((Item.amount * TaxLevel) / 100));
            Item.amount = Item.amount - Tax;
        }

        void OnEntityDeath(BaseCombatEntity Entity, HitInfo Info)
        {
            BasePlayer Player = Entity.ToPlayer();

            if (Player != null)
            {
                if (IsPresident(Player.userID))
                {
                    BasePlayer Killer = null;

                    if (Info != null)
                        Killer = Info.Initiator.ToPlayer();

                    if (Killer != null && Killer.userID != Player.userID)
                    {
                        SetPresident(Killer.userID);
                        PrintToChat(string.Format(lang.GetMessage("PresidentMurdered", this), Killer.displayName));
                    }
                    else
                    {
                        SetPresident(0);
                        PrintToChat(string.Format(lang.GetMessage("PresidentDied", this)));
                    }
                }
            }
        }

        void OnPlayerAttack(BasePlayer Attacker, HitInfo Info)
        {
            BasePlayer Defender = Info.HitEntity.ToPlayer();

            if (Defender != null)
            {
                // Is a person
            }
            else
            {
                uint EntityId = Info.HitEntity.prefabID;

                if (EntityId == 2014947887 || EntityId == 3439001196)
                {
                    StrayPlayer Stray = OnlinePlayers[Attacker.ToPlayer()];

                    if (Stray == null)
                        return;

                    if (Stray.IsSettingTaxChest)
                    {
                        Vector3 BoxPosition = Info.HitEntity.transform.position;
                        float x = BoxPosition.x;
                        float y = BoxPosition.y;
                        float z = BoxPosition.z;

                        SendReply(Attacker.ToPlayer(), lang.GetMessage("SetNewTaxChest", this, Attacker.ToPlayer().UserIDString));

                        TaxChestX = x;
                        TaxChestY = y;
                        TaxChestZ = z;
						
                        SaveTaxContainer();
                        LoadTaxContainer();

                        Stray.IsSettingTaxChest = false;
                    }
                }
            }
        }

        [ChatCommand("settaxchest")]
        void SetTaxChestCommand(BasePlayer Player, string Command, string[] Arguments)
        {
            if (!IsPresident(Player.userID))
            {
                SendReply(Player, lang.GetMessage("PresidentError", this, Player.UserIDString));
                return;
            }

            StrayPlayer Stray = OnlinePlayers[Player];

            if (Stray.IsSettingTaxChest)
            {
                Stray.IsSettingTaxChest = false;
                SendReply(Player, lang.GetMessage("NotSettingNewTaxChest", this, Player.UserIDString));
            }
            else
            {
                Stray.IsSettingTaxChest = true;
                SendReply(Player, lang.GetMessage("SettingNewTaxChest", this, Player.UserIDString));
            }
        }

        [ChatCommand("info")]
        void InfoCommand(BasePlayer Player, string Command, string[] Arguments)
        {
            string PresidentName = "";

            if (President > 0)
            {
                BasePlayer BasePresident = BasePlayer.FindByID(President);

                if (BasePresident != null)
                {
                    PresidentName = BasePresident.displayName;
                }
                else
                {
                    BasePlayer SleepingPresident = BasePlayer.FindSleeping(President);

                    if (SleepingPresident != null)
                    {
                        PresidentName = SleepingPresident.displayName;
                    }
                    else
                    {
                        PresidentName = lang.GetMessage("ClaimPresident", this, Player.UserIDString);
                        President = 0;
                    }
                }
            }
            else
                PresidentName = lang.GetMessage("ClaimPresident", this, Player.UserIDString);

            SendReply(Player, lang.GetMessage("InfoPresident", this, Player.UserIDString) + ": " + PresidentName);
            SendReply(Player, lang.GetMessage("InfoRealmName", this, Player.UserIDString) + ": " + RealmName);
            SendReply(Player, lang.GetMessage("InfoTaxLevel", this, Player.UserIDString) + ": " + TaxLevel + "%");         
        }

        [ChatCommand("claimpresident")]
        void ClaimPresident(BasePlayer Player, string Command, string[] Arguments)
        {
            if (President < 1)
            {
                PrintToChat("<color=#008080ff><b>" + Player.displayName + "</b></color> " + lang.GetMessage("IsNowPresident", this));
                SetPresident(Player.userID);
            }
        }

        [ChatCommand("settax")]
        void SetTaxCommand(BasePlayer Player, string Command, string[] Arguments)
        {
            if (IsPresident(Player.userID))
            {
                double NewTaxLevel = Convert.ToDouble(MergeParams(Arguments, 0));

                if (NewTaxLevel > 25.0)
                    NewTaxLevel = 25.0;

                if (NewTaxLevel == TaxLevel)
                    return;

                if (NewTaxLevel < 1)
                    NewTaxLevel = 0;

                SetTaxLevel(NewTaxLevel);

                PrintToChat(string.Format(lang.GetMessage("UpdateTaxMessage", this), Player.displayName, NewTaxLevel));
            }
            else
                SendReply(Player, lang.GetMessage("PresidentError", this, Player.UserIDString));
        }

        [ChatCommand("realmname")]
        void RealmNameCommand(BasePlayer Player, string Command, string[] Arguments)
        {
            if (IsPresident(Player.userID))
            {
                string NewName = MergeParams(Arguments, 0);

                if (!String.IsNullOrEmpty(NewName))
                {
                    SetRealmName(NewName);
                }
            }
            else
                SendReply(Player, lang.GetMessage("PresidentError", this, Player.UserIDString));
        }

        [ChatCommand("pm")]
        void PrivateMessage(BasePlayer Player, string Command, string[] Arguments)
        {
            string Name = Arguments[0];
            string Message = MergeParams(Arguments, 1);

            if (IsPlayerOnline(Name))
            {
                BasePlayer Reciever = GetPlayer(Name);
                SendReply(Reciever, "<color=#ffff00ff>" + lang.GetMessage("PrivateFrom", this, Reciever.UserIDString) + " " + Player.displayName + "</color>: " + Message);
                SendReply(Player, "<color=#ffff00ff>" + lang.GetMessage("PrivateTo", this, Reciever.UserIDString) + " " + Reciever.displayName + "</color>: " + Message);
            }
            else
                SendReply(Player, Name + lang.GetMessage("PrivateError", this));
        }

        [ChatCommand("players")]
        void PlayersCommand(BasePlayer Player, string Command, string[] Arguments)
        {
            StringBuilder Builder = new StringBuilder();
            int PlayerCount = BasePlayer.activePlayerList.Count;
            int Cycle = 1;
            
            Builder.Append(string.Format(lang.GetMessage("OnlinePlayers", this), PlayerCount) + " ");

            foreach (BasePlayer iPlayer in BasePlayer.activePlayerList)
            {
                Builder.Append(iPlayer.displayName);

                if (Cycle < PlayerCount)
                    Builder.Append(", ");

                Cycle++;
            }

            SendReply(Player, Builder.ToString());
        }

        void AddPlayer(BasePlayer Player)
        {
            GetPlayerFromDatabase(Player);
        }

        void RemovePlayer(BasePlayer Player)
        {
            OnlinePlayers.Remove(Player);
        }

        StrayPlayer GetStrayPlayer(string Username)
        {
            return OnlinePlayers[BasePlayer.Find(Username)];
        }

        bool IsPlayerOnline(string Username)
        {
            if (BasePlayer.Find(Username) != null)
                return true;

            return false;
        }

        BasePlayer GetPlayer(string Username)
        {
            return BasePlayer.Find(Username);
        }

        string MergeParams(string[] Params, int Start)
        {
            var Merged = new StringBuilder();
            for (int i = Start; i < Params.Length; i++)
            {
                if (i > Start)
                    Merged.Append(" ");
                Merged.Append(Params[i]);
            }

            return Merged.ToString();
        }

        bool IsPresident(ulong SteamId)
        {
            if (President == SteamId)
                return true;

            return false;
        }

        void SetPresident(ulong SteamId)
        {
            President = SteamId;
            RealmName = lang.GetMessage("DefaultRealm", this);
            TaxLevel = 0.0;

            string PresidentText = "UPDATE settings SET tax_level = " + TaxLevel + ", realm_name = '" + RealmName + "', president = " + President;

            MySqlCommand UpdatePresident = new MySqlCommand(PresidentText, Database);
            UpdatePresident.ExecuteNonQuery();
            UpdatePresident.Dispose();
        }

        void SetTaxLevel(double NewTaxLevel)
        {
            TaxLevel = NewTaxLevel;

            string TaxText = "UPDATE settings SET tax_level = " + NewTaxLevel;

            MySqlCommand UpdateTax = new MySqlCommand(TaxText, Database);
            UpdateTax.ExecuteNonQuery();
            UpdateTax.Dispose();
        }

        void SetRealmName(string NewName)
        {
            if (NewName.Length > 36)
                NewName = NewName.Substring(0, 36);

            RealmName = NewName;
            PrintToChat(string.Format(lang.GetMessage("RealmRenamed", this), NewName));

            string RealmText = "UPDATE settings SET realm_name = '" + RealmName + "'";

            MySqlCommand RealmCommand = new MySqlCommand(RealmText, Database);
            RealmCommand.ExecuteNonQuery();
            RealmCommand.Dispose();
        }

        void GetPlayerFromDatabase(BasePlayer Player)
        {
            StrayPlayer IPlayer = null;

            string CommandText = "SELECT id FROM players WHERE steam_id = " + Player.userID;
            MySqlCommand Command = new MySqlCommand(CommandText, Database);
            bool Exists = Command.ExecuteScalar() != null ? true : false;
            Command.Dispose();

            if (!Exists)
            {
                string InsertText = "INSERT INTO players (steam_id) VALUES ('" + Player.userID + "')";
                MySqlCommand InsertCommand = new MySqlCommand(InsertText, Database);
                InsertCommand.ExecuteNonQuery();
                InsertCommand.Dispose();
            }

            string InfoText = "SELECT * FROM players WHERE steam_id = " + Player.userID;
            MySqlCommand InfoCommand = new MySqlCommand(InfoText, Database);
            MySqlDataReader InfoReader = InfoCommand.ExecuteReader();

            while (InfoReader.Read())
            {
                IPlayer = new StrayPlayer(Player.userID);
            }

            InfoReader.Dispose();
            InfoCommand.Dispose();

            OnlinePlayers.Add(Player, IPlayer);
        }

        void LoadTaxContainer()
        {
            foreach (StorageContainer Cont in StorageContainer.FindObjectsOfType<StorageContainer>())
            {
                Vector3 ContPosition = Cont.transform.position;
                if (ContPosition.x == TaxChestX && ContPosition.y == TaxChestY && ContPosition.z == TaxChestZ)
                {
                    Puts("Tax Container instance found: " + Cont.GetEntity().GetInstanceID());
                    TaxContainer = Cont;
                }
            }
        }

        void SaveTaxContainer()
        {
            string TaxCommandText = "UPDATE settings SET tax_chest = '" + TaxChestX + ";" + TaxChestY + ";" + TaxChestZ + "'";
            MySqlCommand TaxCommand = new MySqlCommand(TaxCommandText, Database);
            TaxCommand.ExecuteNonQuery();
            TaxCommand.Dispose();
        }

        private void CreateConfigEntry(string Key, string SubKey, string Value)
        {
            if (Config[Key, SubKey] != null)
                return;

            Config[Key, SubKey] = Value;
        }

        private void LoadServerMessages()
        {
            ServerMessages = new Dictionary<string, string>();

            ServerMessages.Add("StartingInformation", "<color=yellow>Welcome to {0}</color>.If you are new, we run a custom plugin where you can become the server President, tax players, and control the economy.Type /info for more information.");
            ServerMessages.Add("PlayerConnected", "has connected to");
            ServerMessages.Add("PlayerDisconnected", "has disconnected from");
            ServerMessages.Add("PresidentDied", "<color=#ff0000ff>The President has died!</color>");
            ServerMessages.Add("PresidentMurdered", "<color=#ff0000ff>The President has been murdered by {0}, who is now the President.</color>");
            ServerMessages.Add("RealmRenamed", "The realm has been renamed to <color=#008080ff>{0}</color>");
            ServerMessages.Add("DefaultRealm", "The land of the Free");
            ServerMessages.Add("OnlinePlayers", "Online players ({0}):");
            ServerMessages.Add("PrivateError", "is either offline or you typed the name wrong.");
            ServerMessages.Add("PrivateFrom", "PM from");
            ServerMessages.Add("PrivateTo", "PM sent to");
            ServerMessages.Add("PresidentError", "You need to be the President to do that!");
            ServerMessages.Add("SettingNewTaxChest", "You are now setting the new tax chest.Hit a storage box to make that the tax chest.");
            ServerMessages.Add("NotSettingNewTaxChest", "You are no longer setting the tax chest.");
            ServerMessages.Add("SetNewTaxChest", "You have set the new tax chest.");
            ServerMessages.Add("ClaimPresident", "Nobody! /claimpresident to become President!");
            ServerMessages.Add("IsNowPresident", "is now the President!");
            ServerMessages.Add("InfoPresident", "President");
            ServerMessages.Add("InfoRealmName", "Realm Name");
            ServerMessages.Add("InfoTaxLevel", "Tax level");
            ServerMessages.Add("UpdateTaxMessage", "President {0} has set Tax to {1}%");

            lang.RegisterMessages(ServerMessages, this);
        }
    }
}

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