/**
* Copyright (c) Lambda Innovation, 2013-2016
* This file is part of the AcademyCraft mod.
* https://github.com/LambdaInnovation/AcademyCraft
* Licensed under GPLv3, see project root for more information.
*/
package cn.academy.ability.command;
import cn.academy.ability.api.Category;
import cn.academy.ability.api.CategoryManager;
import cn.academy.ability.api.Skill;
import cn.academy.ability.api.cooldown.CooldownData;
import cn.academy.ability.api.data.AbilityData;
import cn.academy.ability.api.data.CPData;
import cn.academy.core.command.ACCommand;
import cn.lambdalib.annoreg.core.Registrant;
import cn.lambdalib.annoreg.mc.RegCommand;
import cn.lambdalib.s11n.network.NetworkS11n.NetworkS11nType;
import cn.lambdalib.util.datapart.PlayerDataTag;
import net.minecraft.command.CommandBase;
import net.minecraft.command.ICommandSender;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.server.MinecraftServer;
import net.minecraft.util.StatCollector;
import java.util.List;
/**
* @author WeAthFolD
*/
@Registrant
@NetworkS11nType
public abstract class CommandAIMBase extends ACCommand {
private static final String MSG_CLEAR_COOLDOWN = "clearcd";
/**
* This is the command used by the client, doesn't specify the player and works on the user.
* This command will display a warning before you can use it.
*/
@Registrant
@RegCommand
public static class CommandAIM extends CommandAIMBase {
static final String ID = "aim_cheats";
public CommandAIM() {
super("aim");
}
@Override
public void processCommand(ICommandSender commandSender, String[] pars) {
EntityPlayer player = super.getCommandSenderAsPlayer(commandSender);
if(!isActive(player) && player.getEntityWorld().getWorldInfo().areCommandsAllowed()) {
setActive(player, true);
}
if(pars.length == 1) {
switch(pars[0]) {
case "cheats_on":
setActive(player, true);
sendChat(commandSender, locSuccessful());
sendChat(commandSender, getLoc("warning"));
return;
case "cheats_off":
setActive(player, false);
sendChat(commandSender, locSuccessful());
return;
}
}
if(!isActive(player) && !player.capabilities.isCreativeMode) {
sendChat(commandSender, getLoc("notactive"));
return;
}
if(pars.length == 0) {
sendChat(commandSender, getLoc("help"));
return;
}
matchCommands(commandSender, CommandBase.getCommandSenderAsPlayer(commandSender), pars);
}
private void setActive(EntityPlayer player, boolean data) {
PlayerDataTag.get(player).getTag().setBoolean(ID, data);
}
private boolean isActive(EntityPlayer player) {
return PlayerDataTag.get(player).getTag().getBoolean(ID);
}
}
/**
* This is the command for the OPs and server console. You must specify the player name.
*/
@Registrant
@RegCommand
public static class CommandAIMP extends CommandAIMBase {
public CommandAIMP() {
super("aimp");
}
@Override
public void processCommand(ICommandSender ics, String[] pars) {
if(pars.length == 0) {
sendChat(ics, getLoc("help"));
return;
}
//Try to locate the player.
EntityPlayer player = null;
//Using player parameter
for(Object p : MinecraftServer.getServer().getConfigurationManager().playerEntityList) {
EntityPlayer p2 = (EntityPlayer) p;
if(p2.getCommandSenderName().equals(pars[0])) {
player = p2;
break;
}
}
if(player != null) {
String[] newPars = new String[pars.length - 1];
for(int i = 0; i < newPars.length; ++i) {
newPars[i] = pars[i + 1];
}
matchCommands(ics, player, newPars);
} else {
sendChat(ics, locNoPlayer());
}
}
}
String[] commands = {
"help", "cat", "catlist",
"learn", "learn_all", "reset",
"learned", "skills", "fullcp",
"level", "exp", "cd_clear", "maxout"
};
public CommandAIMBase(String name) {
super(name);
localName = "aim";
}
protected void matchCommands(ICommandSender ics, EntityPlayer player, String[] pars) {
AbilityData aData = AbilityData.get(player);
switch(pars[0]) {
case "?":
case "help": {
for(String c : commands) {
sendChat(ics, getLoc(c));
}
return;
}
case "cat": {
if(pars.length == 1) {
sendChat(ics, getLoc("curcat"), aData.hasCategory() ?
aData.getCategory().getDisplayName() :
StatCollector.translateToLocal(getLoc("nonecat")));
return;
} else if(pars.length == 2) {
String catName = pars[1];
Category cat = CategoryManager.INSTANCE.getCategory(catName);
if(cat != null) {
aData.setCategory(cat);
sendChat(ics, locSuccessful());
} else {
sendChat(ics, getLoc("nocat"));
}
return;
}
break;
}
case "catlist": {
sendChat(ics, getLoc("cats"));
List<Category> catList = CategoryManager.INSTANCE.getCategories();
for(int i = 0; i < catList.size(); ++i) {
Category cat = catList.get(i);
sendChat(ics, "#" + i + " " + cat.getName() + ": " + cat.getDisplayName());
}
return;
}
case "learn": {
if (aData.hasCategory()) {
Skill s = tryParseSkill(aData.getCategory(), pars[1]);
if(s == null) {
sendChat(ics, getLoc("noskill"));
} else {
aData.learnSkill(s);
}
} else {
sendChat(ics, getLoc("nonecathint"));
}
return;
}
case "unlearn": {
if (aData.hasCategory()) {
Category cat = aData.getCategory();
Skill s = tryParseSkill(cat, pars[1]);
if(s == null) {
sendChat(ics, getLoc("noskill"));
} else {
aData.setSkillLearnState(s, false);
}
} else {
sendChat(ics, getLoc("nonecathint"));
}
return;
}
case "learn_all": {
if (aData.hasCategory()) {
aData.learnAllSkills();
sendChat(ics, locSuccessful());
} else {
sendChat(ics, getLoc("nonecathint"));
}
return;
}
case "reset": {
aData.setCategory(null);
sendChat(ics, locSuccessful());
return;
}
case "learned": {
StringBuilder sb = new StringBuilder();
boolean begin = true;
for(Skill s : aData.getLearnedSkillList()) {
sb.append(begin ? "" : ", " + s.getName());
begin = false;
}
sendChat(ics, getLoc("learned.format"), sb.toString());
return;
}
case "skills": {
if (aData.hasCategory()) {
Category cat = aData.getCategory();
for(Skill s : cat.getSkillList()) {
sendChat(ics, "#" + s.getID() + " " + s.getName() + ": " + s.getDisplayName());
}
} else {
sendChat(ics, getLoc("nonecathint"));
}
return;
}
case "level": {
if(pars.length == 1) {
sendChat(ics, "" + aData.getLevel());
} else {
int lv = Integer.valueOf(pars[1]);
if(lv > 0 && lv <= 5) {
aData.setLevel(lv);
sendChat(ics, locSuccessful());
} else {
sendChat(ics, this.getLoc("outofrange"), 1, 5);
}
}
return;
}
case "fullcp": {
if (aData.hasCategory()) {
CPData cpData = CPData.get(player);
cpData.setCP(cpData.getMaxCP());
cpData.setOverload(0);
sendChat(ics, locSuccessful());
return;
} else {
sendChat(ics, getLoc("nonecathint"));
}
return;
}
case "exp": {
if (aData.hasCategory()) {
Category cat = aData.getCategory();
if (pars.length == 1) {
sendChat(ics, this.locInvalid());
} else {
Skill skill = tryParseSkill(cat, pars[1]);
if(skill == null) {
sendChat(ics, getLoc("noskill"));
} else {
if(pars.length == 2) {
sendChat(ics, this.getLoc("curexp"), skill.getDisplayName(), aData.getSkillExp(skill) * 100);
} else if(pars.length == 3) {
Float exp = tryParseFloat(pars[2]);
if(exp < 0 || exp > 1) {
sendChat(ics, this.getLoc("outofrange"), 0.0f, 1.0f);
} else {
aData.setSkillExp(skill, exp);
sendChat(ics, this.locSuccessful());
}
} else {
sendChat(ics, this.locInvalid());
}
}
}
} else {
sendChat(ics, getLoc("nonecathint"));
}
return;
}
case "cd_clear": {
if (aData.hasCategory()) {
CooldownData.of(player).clear();
sendChat(ics, locSuccessful());
return;
} else {
sendChat(ics, getLoc("nonecathint"));
}
return;
}
case "maxout": {
if (aData.hasCategory()) {
aData.maxOutLevelProgress();
sendChat(ics, locSuccessful());
return;
} else {
sendChat(ics, getLoc("nonecathint"));
}
return;
}
default: {
sendChat(ics, getLoc("nocomm"));
return;
}
}
}
private Integer tryParseInt(String str) {
try {
return Integer.parseInt(str);
} catch(NumberFormatException e) {
return null;
}
}
private Float tryParseFloat(String str) {
try {
return Float.parseFloat(str);
} catch(NumberFormatException e) {
return null;
}
}
private Skill tryParseSkill(Category cat, String str) {
if(cat == null)
return null;
Integer i = tryParseInt(str);
if(i != null)
return cat.getSkill(i);
return cat.getSkill(str);
}
}