package admincommands; import java.util.List; import com.aionemu.gameserver.model.gameobjects.Creature; import com.aionemu.gameserver.model.gameobjects.VisibleObject; import com.aionemu.gameserver.model.gameobjects.player.AbsoluteStatOwner; import com.aionemu.gameserver.model.gameobjects.player.Player; import com.aionemu.gameserver.model.stats.calc.StatOwner; import com.aionemu.gameserver.model.stats.calc.functions.IStatFunction; import com.aionemu.gameserver.model.stats.calc.functions.StatFunctionProxy; import com.aionemu.gameserver.model.stats.container.StatEnum; import com.aionemu.gameserver.network.aion.serverpackets.SM_STATS_INFO; import com.aionemu.gameserver.network.aion.serverpackets.SM_SYSTEM_MESSAGE; import com.aionemu.gameserver.skillengine.model.Effect; import com.aionemu.gameserver.utils.PacketSendUtility; import com.aionemu.gameserver.utils.chathandlers.AdminCommand; /** * @author MrPoke */ public class Stat extends AdminCommand { public Stat() { super("stat", "Shows stat info of your target."); // @formatter:off setSyntaxInfo( " [details] - Show active stat functions for the given stat (default: just the name, optional: detailed).", " - Apply fixed stats of the given stats_set ID from absolute_stats.xml or cancel them." ); // @formatter:on } @Override public void execute(Player admin, String... params) { if (params.length == 0) { sendInfo(admin); return; } VisibleObject target = admin.getTarget(); if (!(target instanceof Creature)) { PacketSendUtility.sendPacket(admin, SM_SYSTEM_MESSAGE.STR_INVALID_TARGET()); return; } Creature creature = (Creature) target; if (params.length == 1) { List stats = creature.getGameStats().getStatsSorted(StatEnum.valueOf(params[0])); for (IStatFunction stat : stats) { sendInfo(admin, stat.toString()); } } else if (params.length == 2 && "details".equals(params[1])) { List stats = creature.getGameStats().getStatsSorted(StatEnum.valueOf(params[0])); for (IStatFunction stat : stats) { String details = collectDetails(stat); sendInfo(admin, details); } } else if ("abs".equals(params[0])) { if (!(target instanceof Player)) { sendInfo(admin, "Only players can be selected"); return; } AbsoluteStatOwner absStats = ((Player) target).getAbsoluteStats(); try { Integer templateId = Integer.parseInt(params[1]); absStats.setTemplate(templateId); absStats.apply(); if (absStats.isActive()) { sendInfo(admin, "Successfully applied absolute stats"); } else { sendInfo(admin, "No such template exists!"); } } catch (NumberFormatException ex) { if (!"cancel".equalsIgnoreCase(params[1])) { sendInfo(admin, "Not a number"); return; } if (!absStats.isActive()) { sendInfo(admin, "Nothing to cancel"); return; } absStats.cancel(); sendInfo(admin, "Successfully canceled absolute stats"); PacketSendUtility.sendPacket((Player) target, new SM_STATS_INFO((Player) target)); } } else { sendInfo(admin); } } private String collectDetails(IStatFunction stat) { StringBuilder sb = new StringBuilder(); sb.append(stat.toString() + "\n"); if (stat instanceof StatFunctionProxy) { StatFunctionProxy proxy = (StatFunctionProxy) stat; sb.append(" -- " + proxy.getProxiedFunction().toString()); } StatOwner owner = stat.getOwner(); if (owner instanceof Effect) { Effect effect = (Effect) owner; sb.append("\n -- skillId: " + effect.getSkillId()); sb.append("\n -- skillName: " + effect.getSkillName()); } return sb.toString(); } }