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 + "!");
}
}
}