package ring.players; import javax.xml.bind.annotation.XmlRootElement; import javax.xml.bind.annotation.XmlTransient; import ring.commands.CommandResult; import ring.commands.CommandSender; import ring.mobiles.Mobile; import ring.world.TickerEvent; import ring.world.TickerListener; @XmlRootElement(name = "playerCharacter") /** * A class representing a PlayerCharacter in the world. This particular version * of Mobile implements client-server communication by having a Communicator. * * @author projectmoon * */ public class PlayerCharacter extends Mobile implements CommandSender, TickerListener { private static final long serialVersionUID = 1L; private transient boolean quitting; private transient Player controllingPlayer; public PlayerCharacter() {} public PlayerCharacter(String pName) { super.getBaseModel().setName(pName); } @XmlTransient public Player getPlayer() { return controllingPlayer; } public void setPlayer(Player player) { controllingPlayer = player; } @Override /** * Explicitly overriden to make sure that PC IDs and names are the same. */ public String getID() { return getBaseModel().getName(); } @Override /** * Explicitly overriden to make sure that PC IDs and names are the same. */ public void setID(String id) { super.setID(id); getBaseModel().setName(id); } // processTick method. public synchronized void processTick(TickerEvent e) { super.processTick(e); } /** * Returns the prompt for this player. * @return The prompt. */ @XmlTransient public String getPrompt() { return "\n\n[B][GREEN]HP: " + getCombatModel().getCurrentHPString() + "/" + getCombatModel().getMaxHPString() + " MV: " + getDynamicModel().getCurrentMV() + "/" + getDynamicModel().getMaxMV() + " ]> [R][WHITE]"; } /** * Overriden to actually send data to the player indicating their * lock is done. */ @Override public void decrementLockTime() { super.decrementLockTime(); } /** * Overriden to deal with player-specific options for commands. * @param command */ public void doCommand(String command) { CommandResult res; // Was anything even typed? // If not, do nothing. if (command.length() <= 0) { res = new CommandResult(); res.setText(""); res.setSuccessful(true); res.send(); return; } // Is the player locked? if (super.isLocked()) { res = new CommandResult(); res.setFailText(super.lockMessage + " (" + super.lockTimeRemaining * 2 + " seconds left)"); res.setSuccessful(false); res.send(); return; } // Send the command. super.handler.sendCommand(command); } public String toString() { return getBaseModel().getName(); } public void quit() { quitting = true; } @XmlTransient public boolean isQuitting() { return quitting; } /** * Returns this player's current whotag, based on a number of different * factors. * * @return The whotag. */ @XmlTransient public String getWhoTag() { // "playername racename level classname zonename ethical moral <god status> <player set status> <admin set status>" StringBuilder sb = new StringBuilder(); sb.append(getBaseModel().getName()).append(' '); sb.append(getBaseModel().getRace().getName()).append(' '); sb.append(getBaseModel().getLevel()).append(' '); sb.append(getBaseModel().getMobileClass().getName()).append(' '); // sb.append(getZone()).append(' '); sb.append(getBaseModel().getAlignment().toNonFormattedString()).append(' '); sb.append(getBaseModel().getType().getName()).append(' '); return sb.toString().toLowerCase(); } /* (non-Javadoc) * @see java.lang.Object#hashCode() */ @Override public int hashCode() { final int prime = 31; int result = super.hashCode(); result = prime * result + ((controllingPlayer == null) ? 0 : controllingPlayer .hashCode()); return result; } /* (non-Javadoc) * @see java.lang.Object#equals(java.lang.Object) */ @Override public boolean equals(Object obj) { if (this == obj) return true; if (!super.equals(obj)) return false; if (getClass() != obj.getClass()) return false; PlayerCharacter other = (PlayerCharacter) obj; if (controllingPlayer == null) { if (other.controllingPlayer != null) return false; } else if (!controllingPlayer.equals(other.controllingPlayer)) return false; return true; } }