/clan

/clan

Postby ismellike » 21 Oct 2013, 03:07

Finally!
I made this because my old clan command was pretty bad xd.
It has some pretty good stuff, and I bet people can learn from it.

Code: Select all
using System.Xml;
using System.Collections.Generic;
using System.Linq;
namespace MCDzienny
{
    public class CmdClan : Command
    {
        public override string name { get { return "clan"; } }
        public override string shortcut { get { return ""; } }
        public override string type { get { return "other"; } }
        public override bool museumUsable { get { return false; } }
        public override LevelPermission defaultRank { get { return LevelPermission.Banned; } }
        public Clan clanManager = new Clan();
        public override void Init()
        {
            if (!System.IO.File.Exists(ClanHelper.path))
                using (XmlWriter xw = XmlWriter.Create(ClanHelper.path, ClanHelper.writerSettings))
                {
                    xw.WriteStartDocument();
                    xw.WriteComment("Ismellike - the beast - presents you with clans 2.0");
                    xw.WriteStartElement("Clans");
                    xw.WriteElementString("Beasts", "ismellike");
                    xw.WriteEndElement();
                    xw.WriteEndDocument();
                }
            ClanHelper.xdoc.LoadXml(System.IO.File.ReadAllText(ClanHelper.path));
        }
        public override void Use(Player p, string message)
        {
            string[] split = message.ToLower().Split(' ');
            if (p.isInClan())
                switch (split[0])
                {
                    case "edit":
                        if (!p.clan().isOwner(p))
                        {
                            p.SendMessage("You are not the clan owner");
                            return;
                        }
                        if (split.Length < 2)
                        {
                            p.SendMessage("You must specify your edit");
                            return;
                        }
                        switch (split[1])
                        {
                            case "fee":
                                p.Deduct(10);
                                p.clan().Edit(ClanHelper.Area.EntranceFee, split[2]);
                                return;
                            case "home":
                                p.Deduct(50);
                                p.clan().Edit(ClanHelper.Area.Home, split[2]);
                                return;
                            case "kick":
                                p.clan().Edit(ClanHelper.Area.Members, Player.Find(split[2]).name ?? split[2]);
                                return;
                            case "title":
                                p.Deduct(30);
                                p.clan().Edit(ClanHelper.Area.Title, split[2]);
                                return;
                            default:
                                p.SendMessage("That was not a valid option");
                                return;
                        }
                    case "deposit":
                        uint amount;
                        if (uint.TryParse(split[1], out amount))
                            p.clan().Deposit(p, amount, false);
                        else
                            p.SendMessage("Not a valid value");
                        return;
                    case "name":
                        p.SendMessage(p.clan().name);
                        return;
                    case "title":
                        Command.all.Find("settitle").Use(p, p.name + " " + p.clan().clanTitle);
                        return;
                    case "bank":
                        p.SendMessage(p.clan().bank.ToString());
                        return;
                    case "leave":
                        p.Deduct(25);
                        p.clan().Edit(ClanHelper.Area.Members, p.name);
                        return;
                    case "members":
                        p.SendMessage(p.clan().members);
                        return;
                    case "home":
                        if (!System.IO.File.Exists("levels\\" + p.clan().home + ".lvl"))
                            Command.all.Find("newlvl").Use(null, p.clan().home + " 64 64 64 flat");
                        Command.all.Find("goto").Use(p, p.clan().home);
                        return;
                }
            //General Clan Stuff
            switch (split[0])
            {
                case "create":
                    uint fee;
                    if (split.Length > 2)
                        if (uint.TryParse(split[2], out fee))
                            clanManager.CreateClan(p, split[1], fee);
                        else
                            p.SendMessage("That was not a valid entrance fee");
                    else
                        p.SendMessage("Please specify all values");
                    break;
                case "join":
                    p.joinClan(split[1]);
                    break;
                case "clans":
                    p.SendClans();
                    break;
                case "help":
                    Help(p);
                    break;
                case "top":
                    if (split.Length < 2)
                    {
                        p.SendMessage("You must specify which topscores to see");
                        return;
                    }
                    switch (split[1])
                    {
                        case "money":
                            p.sendTop(ClanHelper.Topscores.money);
                            break;
                        case "members":
                            p.sendTop(ClanHelper.Topscores.members);
                            break;
                        case "fee":
                            p.sendTop(ClanHelper.Topscores.fee);
                            break;
                        default:
                            p.SendMessage("Topscores weren't found");
                            break;
                    }
                    break;
                default:
                    Help(p);
                    break;
            }
        }
        public override void Help(Player p)
        {
            p.SendMessage("/clan create [name] [entrance fee] -- creates a clan for 100 " + Server.moneys);
            p.SendMessage("/clan home -- takes you to your clan's home");
            p.SendMessage("/clan members/bank/title/name -- gives you clan information");
            p.SendMessage("/clan leave/join -- manages your clan life");
            p.SendMessage("/clan top money/members/fee -- tells you who not to mess with");
            p.SendMessage("/clan clans -- gives you a list of clans");
            p.SendMessage("/clan deposit [amount] -- makes your clan richer");
            if (p.clan().isOwner(p))
                p.SendMessage("/clan edit kick/fee/home/title -- edits your clan's settings");
        }
    }
    public static class ClanHelper
    {
        public static string path = System.Windows.Forms.Application.StartupPath + @"\extra\clans.xml";
        public static XmlDocument xdoc = new XmlDocument();
        public static int results = 10;
        public static void Deduct(this Player p, int money)
        {
            p.SendMessage("That cost you " + money.ToString() + " " + Server.moneys + ".");
            p.money -= money;
        }
        public static void Deposit(this Clan clan, Player p, uint amount, bool global)
        {
            clan.bank += amount;
            if (!global)
                Player.GlobalMessage(amount.ToString() + " was deposited into " + clan.name + " by " + p.PublicName);
            else
                p.SendMessage("It was deposited into the clan");
            clan.Save();
        }
        public static void sendTop(this Player p, Topscores top)
        {
            List<KeyValuePair<string, int>> records = new List<KeyValuePair<string, int>>();
            switch (top)
            {
                case Topscores.money:
                    foreach (XmlNode xn in xdoc.LastChild.ChildNodes)
                        foreach (XmlNode info in xn.ChildNodes)
                            if (info.LocalName == "bank")
                            {
                                records.Add(new KeyValuePair<string, int>(xn.Name, int.Parse(info.InnerText)));
                            }
                    break;
                case Topscores.members:
                    foreach (XmlNode xn in xdoc.LastChild.ChildNodes)
                        foreach (XmlNode info in xn.ChildNodes)
                            if (info.LocalName == "members")
                            {
                                records.Add(new KeyValuePair<string, int>(xn.Name, info.InnerText.Split(',').Count() - 1));
                            }
                    break;
                case Topscores.fee:
                    foreach (XmlNode xn in xdoc.LastChild.ChildNodes)
                        foreach (XmlNode info in xn.ChildNodes)
                            if (info.LocalName == "fee")
                            {
                                records.Add(new KeyValuePair<string, int>(xn.Name, int.Parse(info.InnerText)));
                            }
                    break;
            }
            records.Sort((firstPair, nextPair) =>
            {
                return firstPair.Value.CompareTo(nextPair.Value);
            });
            int i = results;
            p.SendMessage("The top ten clans with " + top.ToString() + "!");
            records.ForEach(delegate(KeyValuePair<string, int> record)
            {
                if (i <= 0)
                    return;
                p.SendMessage(i.ToString() + ".) " + record.Key + " - " + record.Value);
                i--;
            });
        }
        public enum Topscores
        {
            money,
            members,
            fee,
        }
        public static void SendClans(this Player p)
        {
            System.Text.StringBuilder sb = new System.Text.StringBuilder();
            foreach (XmlNode xn in xdoc.LastChild.ChildNodes)
            {
                sb.Append(xn.Name + ",");
            }
            p.SendMessage(sb.ToString());
        }
        public static void joinClan(this Player p, string clan)
        {
            if (p.isInClan())
            {
                p.SendMessage("You are already in a clan!");
                return;
            }
            bool found = false;
            int i = 0;
            foreach (XmlNode xn in xdoc.LastChild.ChildNodes)
                if (xn.LocalName == clan)
                {
                    found = true;
                    foreach (XmlNode info in xn.ChildNodes)
                        if (info.LocalName == "members")
                            info.InnerText += p.name + ",";
                        else if (info.LocalName == "fee")
                            p.Deduct(i = int.Parse(info.InnerText));
                }
            if (!found)
                p.SendMessage("The clan was not found");
            else
            {
                xdoc.Save(ClanHelper.path);
                p.clan().Deposit(p, (uint)i, true);
                Player.GlobalMessage(p.PublicName + " has just joined " + clan + "!");
            }
        }
        public static bool isInClan(this Player p)
        {
            if (p.clan() == null)
                return false;
            else
                return true;
        }
        public static void Save(this Clan clan)
        {
            foreach (XmlNode xn in xdoc.LastChild.ChildNodes)
                if (xn.LocalName == clan.name)
                    foreach (XmlNode info in xn.ChildNodes)
                    {
                        switch (info.LocalName)
                        {
                            case "bank":
                                info.InnerText = clan.bank.ToString();
                                break;
                            case "members":
                                info.InnerText = clan.members;
                                break;
                            case "fee":
                                info.InnerText = clan.entranceFee.ToString();
                                break;
                            case "title":
                                info.InnerText = clan.clanTitle;
                                break;
                            case "home":
                                info.InnerText = clan.home;
                                break;
                        }
                    }
            xdoc.Save(path);
        }
        public static XmlReaderSettings readerSettings = new XmlReaderSettings() { IgnoreComments = true, IgnoreWhitespace = true };
        public static XmlWriterSettings writerSettings = new XmlWriterSettings() { Indent = true };
        public static Clan clan(this Player p)
        {
            foreach (XmlNode xn in xdoc.LastChild.ChildNodes)
                foreach (XmlNode info in xn.ChildNodes)
                    if (info.LocalName == "members")
                        if (info.InnerText.Contains(p.name))
                        {
                            Clan c = new Clan() { name = xn.Name };
                            c.SetVars();
                            return c;
                        }
            return null;
        }
        public static bool isOwner(this Clan clan, Player p)
        {
            if (clan == null)
                return false;
            if (clan.members.Split(',')[0] == p.name)
                return true;
            return false;
        }
        public static void SetVars(this Clan clan)
        {
            foreach (XmlNode xn in xdoc.LastChild.ChildNodes)
                if (xn.LocalName == clan.name)
                    foreach (XmlNode info in xn.ChildNodes)
                    {
                        switch (info.LocalName)
                        {
                            case "bank":
                                uint.TryParse(info.InnerText, out clan.bank);
                                break;
                            case "members":
                                clan.members = info.InnerText;
                                break;
                            case "fee":
                                uint.TryParse(info.InnerText, out clan.entranceFee);
                                break;
                            case "title":
                                clan.clanTitle = info.InnerText;
                                break;
                            case "home":
                                clan.home = info.InnerText;
                                break;
                        }
                    }
        }
        public static void Edit(this Clan clan, Area area, string edit)
        {
            switch (area)
            {
                case Area.Name:
                    clan.name = edit;
                    break;
                case Area.EntranceFee:
                    clan.entranceFee = uint.Parse(edit);
                    break;
                case Area.Home:
                    clan.home = edit;
                    break;
                case Area.Members:
                    if (clan.members.Contains(edit + ","))
                    {
                        clan.members = clan.members.Replace(edit + ",", "");
                        Player.GlobalMessage(Player.Find(edit).PublicName + " has just left " + clan.name + ".");
                    }
                    break;
                case Area.Title:
                    clan.clanTitle = edit;
                    break;
            }
            clan.Save();
        }
        public enum Area
        {
            Name,
            EntranceFee,
            Home,
            Members,
            Title,
        }
    }
    public class Clan
    {
        public string name;
        public string members;
        public string home;
        public uint entranceFee;
        public uint bank;
        public string clanTitle;
        public void CreateClan(Player p, string clanName, uint clanEntranceFee)
        {
            if (p.isInClan())
            {
                p.SendMessage("You are already in a clan!");
                return;
            }
            if (p.money < 100)
                return;
            p.Deduct(100);
            name = clanName;
            entranceFee = clanEntranceFee;
            XmlElement xe = ClanHelper.xdoc.CreateElement(name);
            ClanHelper.xdoc.DocumentElement.AppendChild(xe);
            xe = ClanHelper.xdoc.CreateElement("members");
            ClanHelper.xdoc.DocumentElement.LastChild.AppendChild(xe);
            xe.InnerText = p.name + ",";
            xe = ClanHelper.xdoc.CreateElement("fee");
            ClanHelper.xdoc.DocumentElement.LastChild.AppendChild(xe);
            xe.InnerText = entranceFee.ToString();
            xe = ClanHelper.xdoc.CreateElement("bank");
            ClanHelper.xdoc.DocumentElement.LastChild.AppendChild(xe);
            xe.InnerText = "0";
            xe = ClanHelper.xdoc.CreateElement("home");
            ClanHelper.xdoc.DocumentElement.LastChild.AppendChild(xe);
            xe.InnerText = "clan_" + name;
            xe = ClanHelper.xdoc.CreateElement("title");
            ClanHelper.xdoc.DocumentElement.LastChild.AppendChild(xe);
            xe.InnerText = name;
            ClanHelper.xdoc.Save(ClanHelper.path);
            Player.GlobalMessage("The clan " + name + " has just been created by " + p.PublicName + "!");
        }
    }
}
What a beast...
User avatar
ismellike
Coder
 
Posts: 731
Joined: 31 Oct 2012, 04:04
Location: Kansas

Re: /clan

Postby _Retaliate_ » 21 Oct 2013, 06:31

why did you put a ! in
if (!global)
that means if you put false, then it will do a global message, and if you put true, it won't.
Image
_Retaliate_
 
Posts: 68
Joined: 26 Sep 2013, 11:16

Re: /clan

Postby ismellike » 21 Oct 2013, 18:59

That's what I did at first; but, when I was testing it, it would do the opposite.
What a beast...
User avatar
ismellike
Coder
 
Posts: 731
Joined: 31 Oct 2012, 04:04
Location: Kansas

Re: /clan

Postby Leeizazombie » 19 Dec 2013, 00:14

This command won't function properly, as I've seen on a server and also tested it myself, anytime I use /clan create (myclan) (fee) nothing happens at all... and nothing shows up in /clan clans but beasts of which cannot be found when trying to join.
Owner of:
LeeIzaZombie Freebuild and Lava Survival V2 (Shut Down and updated)
LeeIzaZombie Survival (Comming back soon)

Contact:
Skype: leeizazombie
IRC: irc.geekshed.net, #leeizazombie, #mcclassichosting
User avatar
Leeizazombie
 
Posts: 536
Joined: 10 Jun 2013, 17:45
Location: Ireland.


Return to Custom Commands

Who is online

Users browsing this forum: No registered users and 5 guests

cron