// Change player class
void ChangeClass(Player player, Command cmd)
{
string name = cmd.Next();
string newClassName = cmd.Next();
if (name == null || newClassName == null)
{
player.Message("Usage: " + Color.Help + "/user PlayerName ClassName");
player.Message("To see a list of classes and permissions, use " + Color.Help + "/class");
return;
}
Player target = world.FindPlayer(name);
if (target == null)
{
world.NoPlayerMessage(player, name);
return;
}
PlayerClass newClass = world.classes.FindClass(newClassName);
if (newClass == null)
{
player.Message("Unrecognized player class: " + newClassName);
return;
}
if (target.info.playerClass == newClass)
{
player.Message(target.name + "'s class is already " + newClass.color + newClass.name);
return;
}
bool promote = target.info.playerClass.rank < newClass.rank;
if ((promote && !player.Can(Permissions.Promote)) || !promote && !player.Can(Permissions.Demote))
{
world.NoAccessMessage(player);
return;
}
if (promote && !player.info.playerClass.CanPromote(newClass))
{
PlayerClass maxRank = player.info.playerClass.maxPromote;
if (maxRank == null)
{
player.Message("You can only promote players up to " + player.info.playerClass.color + player.info.playerClass.name);
}
else
{
player.Message("You can only promote players up to " + maxRank.color + maxRank.name);
}
return;
}
else if (!promote && !player.info.playerClass.CanDemote(target.info.playerClass))
{
PlayerClass maxRank = player.info.playerClass.maxDemote;
if (maxRank == null)
{
player.Message("You can only demote players that are " + player.info.playerClass.color + player.info.playerClass.name + Color.Sys + " or lower.");
}
else
{
player.Message("You can only demote players that are " + maxRank.color + maxRank.name + Color.Sys + " or lower.");
}
return;
}
if (promote && target.info.playerClass.rank < newClass.rank ||
target.info.playerClass.rank > newClass.rank)
{
world.log.Log("{0} changed the class of {1} from {2} to {3}.", LogType.UserActivity,
player.name, target.info.name, target.info.playerClass.name, newClass.name);
target.info.playerClass = newClass;
target.info.classChangeDate = DateTime.Now;
target.info.classChangedBy = player.name;
target.Send(PacketWriter.MakeSetPermission(target));
if (promote)
{
player.Message("You promoted " + target.name + " to " + newClass.color + newClass.name + ".");
target.Message("You have been promoted to " + newClass.color + newClass.name + Color.Sys + " by " + player.name + "!");
}
else
{
player.Message("You demoted " + target.name + " to " + newClass.color + newClass.name + ".");
target.Message("You have been demoted to " + newClass.color + newClass.name + Color.Sys + " by " + player.name + "!");
}
if (world.config.GetBool("ClassPrefixesInList") || world.config.GetBool("ClassColorsInChat")) // TODO: colors in player names
{
world.UpdatePlayer(target);
}
target.mode = BlockPlacementMode.Normal;
}
else
{
if (promote)
{
player.Message(target.name + " is already same or lower rank than " + newClass.name);
}
else
{
player.Message(target.name + " is already same or higher rank than " + newClass.name);
}
}
}