/* * Copyright (C) 2002 Devon Jones * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * * NetworkCombatant.java * * Created on January 24, 2002, 11:15 AM */ package plugin.network; import gmgen.plugin.Combatant; import gmgen.plugin.State; import gmgen.plugin.SystemAttribute; import gmgen.plugin.SystemHP; import gmgen.plugin.SystemInitiative; import java.io.BufferedOutputStream; import java.io.PrintStream; import java.net.Socket; import java.util.List; import java.util.StringTokenizer; import java.util.Vector; import org.jdom.Element; /** *@author devon *@since March 20, 2003 *@version $Revision$ */ public class NetworkCombatant extends Combatant { /* * History: * March 20, 2003: Cleanup for Version 1.0 */ protected String name = ""; protected String uid; protected String player = ""; protected String htmlString = ""; protected float cr = 0; protected int xp = 0; protected Socket sock; /** * Creates new Combatant * @param uid * @param sock */ public NetworkCombatant(String uid, Socket sock) { this.uid = uid; this.sock = sock; this.init = new NetworkInitiative(uid, sock); this.hitPoints = new SystemHP(new SystemAttribute("Constitution", 10), 1, 1); } @Override public void setCR(float cr) { this.cr = cr; sendNetMessage("CR|" + cr); } @Override public float getCR() { return cr; } public String getUid() { return uid; } @Override public String getName() { return name; } /** * Sets the Combatant Type. * @param comType * */ @Override public void setCombatantType(String comType) { super.setCombatantType(comType); sendNetMessage("COMTYPE|" + comType); } @Override public void setDuration(int duration) { super.setDuration(duration); sendNetMessage("DURATION|" + duration); } @Override public void setName(String name) { this.name = name; sendNetMessage("NAME|" + name); } /** * Sets the number attribute of the Combatant object * *@param number The new number value */ @Override public void setNumber(int number) { super.setNumber(number); sendNetMessage("NUMBER|" + number); } /** * Creates a Vector intended for use as a row in a JTable * *@param columnOrder The current table's column order *@return The Row Vector */ @Override public Vector<Object> getRowVector(List<String> columnOrder) { Vector<Object> rowVector = new Vector<Object>(); //Iterate through all the columns, and create the vector in that order for (String columnName : columnOrder) { if (columnName.equals("Name")) { // Character's Name rowVector.add(getName()); } else if (columnName.equals("Player")) { // Player's Name rowVector.add("Net: " + getPlayer()); } else if (columnName.equals("Status")) { // Status of Combatant rowVector.add(getStatus()); } else if (columnName.equals("+")) { // Initiative bonus rowVector.add("" + init.getModifier()); } else if (columnName.equals("Init")) { // Initiative # rowVector.add("" + init.getCurrentInitiative()); } else if (columnName.equals("Dur")) { // Duration if (duration == 0) { rowVector.add(""); } else { rowVector.add("" + getDuration()); } } else if (columnName.equals("#")) { // Number (for tokens) rowVector.add("" + number); } else if (columnName.equals("HP")) { // Current Hit Points int hp = hitPoints.getCurrent(); int sub = hitPoints.getSubdual(); if (sub == 0) { rowVector.add("" + hp); } else if (sub > 0) { rowVector.add(hp + "/" + sub + "s"); } } else if (columnName.equals("HP Max")) { // Max Hit Points rowVector.add("" + hitPoints.getMax()); } else if (columnName.equals("Type")) { //PC, Enemy, Ally, Non-Com rowVector.add(comType); } } return rowVector; } @Override public void editRow(List<String> columnOrder, int colNumber, Object data) { String columnName = columnOrder.get(colNumber); String strData = String.valueOf(data); //Determine which row was edited if (columnName.equals("Name")) { // Character's Name setName(strData); } else if (columnName.equals("Player")) { // Player's Name setPlayer(strData); } else if (columnName.equals("Status")) { // XML Combatant's Status setStatus((State) data); } else if (columnName.equals("+")) { // Initiative bonus init.setBonus(Integer.parseInt(strData)); } else if (columnName.equals("Init")) { // Initiative init.setCurrentInitiative(Integer.parseInt(strData)); } else if (columnName.equals("#")) { // Number (for tokens) setNumber(Integer.parseInt(strData)); } else if (columnName.equals("HP")) { // Current Hit Points hitPoints.setCurrent(Integer.parseInt(strData)); sendNetMessage("HP|" + hitPoints.getCurrent()); sendNetMessage("HPSTATE|" + hitPoints.getState()); sendNetMessage("STATUS|" + status); } else if (columnName.equals("HP Max")) { // Maximum Hit Points hitPoints.setMax(Integer.parseInt(strData)); sendNetMessage("HPMAX|" + hitPoints.getMax()); sendNetMessage("HP|" + hitPoints.getCurrent()); sendNetMessage("HPSTATE|" + hitPoints.getState()); sendNetMessage("STATUS|" + status); } else if (columnName.equals("Dur")) { // Duration setDuration(Integer.parseInt(strData)); } else if (columnName.equals("Type")) { // Type setCombatantType(strData); } } /** * Sets the status of the Combatant * *@param status The new status value */ @Override public void setStatus(State status) { super.setStatus(status); sendNetMessage("STATUS|" + status.name()); } @Override public void setXP(int xp) { this.xp = xp; sendNetMessage("XP|" + xp); } @Override public int getXP() { return xp; } /** Causes the Combatant to bleed for 1 point of damage */ @Override public void bleed() { super.bleed(); sendNetMessage("HP|" + hitPoints.getCurrent()); sendNetMessage("HPSTATE|" + hitPoints.getState()); sendNetMessage("STATUS|" + status); } /** * Does damage to the Combatant * *@param damage number of points of damage to do */ @Override public void damage(int damage) { super.damage(damage); sendNetMessage("HP|" + hitPoints.getCurrent()); sendNetMessage("HPSTATE|" + hitPoints.getState()); sendNetMessage("STATUS|" + status); } /** * Decrements the duration * *@return new duration */ @Override public int decDuration() { super.decDuration(); sendNetMessage("DURATION|" + duration); sendNetMessage("HPSTATE|" + hitPoints.getState()); sendNetMessage("STATUS|" + status); return duration; } @Override public void endRound() { super.endRound(); sendNetMessage("HP|" + hitPoints.getCurrent()); sendNetMessage("HPSTATE|" + hitPoints.getState()); sendNetMessage("STATUS|" + status); } /** * Heals the Combatant * *@param heal amount of healing to do */ @Override public void heal(int heal) { super.heal(heal); sendNetMessage("HP|" + hitPoints.getCurrent()); sendNetMessage("HPSTATE|" + hitPoints.getState()); sendNetMessage("STATUS|" + status); } @Override public void kill() { super.kill(); sendNetMessage("HP|" + hitPoints.getCurrent()); sendNetMessage("HPSTATE|" + hitPoints.getState()); sendNetMessage("STATUS|" + status); } @Override public void nonLethalDamage(boolean type) { super.nonLethalDamage(type); sendNetMessage("DURATION|" + duration); sendNetMessage("STATUS|" + status); } /** Raises a dead Combatant */ @Override public void raise() { super.raise(); sendNetMessage("HP|" + hitPoints.getCurrent()); sendNetMessage("HPSTATE|" + hitPoints.getState()); sendNetMessage("STATUS|" + status); } /** Stabilizes the Combatant */ @Override public void stabilize() { super.stabilize(); sendNetMessage("STATUS|" + status); } /** * Does subdual damage to the Combatant * *@param damage number of points of damage to do */ @Override public void subdualDamage(int damage) { super.subdualDamage(damage); sendNetMessage("HPSUB|" + hitPoints.getSubdual()); sendNetMessage("HPSTATE|" + hitPoints.getState()); sendNetMessage("STATUS|" + status); } @Override public SystemInitiative getInitiative() { return init; } @Override public String getPlayer() { return player; } public void setPlayer(String player) { this.player = player; sendNetMessage("PLAYER|" + player); } @Override public Element getSaveElement() { return new Element("NetworkCombatant"); } private void sendNetMessage(String message) { try { PrintStream os = new PrintStream(new BufferedOutputStream(sock .getOutputStream()), true, "UTF-8"); os.print("Pcg: " + uid + ":" + message + "\r\n"); os.flush(); //os.close(); } catch (Exception e) { // TODO Handle this? } } public void recieveNetMessage(String message) { String type = ""; String value = ""; StringTokenizer st = new StringTokenizer(message, "|"); if (st.hasMoreTokens()) { type = st.nextToken(); } if (st.hasMoreTokens()) { value = st.nextToken(); } try { if (type != "" && value != "") { if (type.equals("COMTYPE")) { super.setCombatantType(value); } else if (type.equals("CR")) { this.cr = Float.parseFloat(value); } else if (type.equals("DURATION")) { super.setDuration(Integer.parseInt(value)); } else if (type.equals("HP")) { hitPoints.setCurrent(Integer.parseInt(value)); } else if (type.equals("HPMAX")) { hitPoints.setMax(Integer.parseInt(value)); } else if (type.equals("HPSUB")) { hitPoints.setSubdual(Integer.parseInt(value)); } else if (type.equals("HPSTATE")) { hitPoints.setState(State.getState(value)); } else if (type.equals("NAME")) { this.name = value; } else if (type.equals("NUMBER")) { super.setNumber(Integer.parseInt(value)); } else if (type.equals("PLAYER")) { this.player = value; } else if (type.equals("STATUS")) { super.setStatus(State.getState(value)); } else if (type.equals("XP")) { this.xp = Integer.parseInt(value); } else if (type.startsWith("HTMLSTRING")) { this.htmlString = value; } else if (type.startsWith("INIT")) { ((NetworkInitiative) init).recieveNetMessage(message); } } } catch (Exception e) { // TODO Handle this? } } public static void recieveServerMessage(String message, Combatant cbt) { String type = ""; String value = ""; StringTokenizer st = new StringTokenizer(message, "|"); if (st.hasMoreTokens()) { type = st.nextToken(); } if (st.hasMoreTokens()) { value = st.nextToken(); } try { if (type != "" && value != "") { if (type.equals("COMTYPE")) { cbt.setCombatantType(value); } else if (type.equals("CR")) { cbt.setCR(Float.parseFloat(value)); } else if (type.equals("DURATION")) { cbt.setDuration(Integer.parseInt(value)); } else if (type.equals("HPMAX")) { cbt.getHP().setMax(Integer.parseInt(value)); } else if (type.equals("HP")) { cbt.getHP().setCurrent(Integer.parseInt(value)); } else if (type.equals("HPSUB")) { cbt.getHP().setSubdual(Integer.parseInt(value)); } else if (type.equals("HPSTATE")) { cbt.getHP().setState(State.getState(value)); } else if (type.equals("NAME")) { cbt.setName(value); } else if (type.equals("NUMBER")) { cbt.setNumber(Integer.parseInt(value)); } else if (type.equals("STATUS")) { cbt.setStatus(State.getState(value)); } else if (type.equals("XP")) { cbt.setXP(Integer.parseInt(value)); } else if (type.startsWith("INITBONUS")) { cbt.init.setBonus(Integer.parseInt(value)); } else if (type.startsWith("INIT")) { cbt.init.setCurrentInitiative(Integer.parseInt(value)); } } } catch (Exception e) { // TODO Handle This? } } public static String getCombatantUid(Combatant cbt, String user) { return cbt.getName() + "-" + cbt.getPlayer() + "-" + user; } public static void sendCombatant(Combatant cbt, NetworkClient client) { String uid = getCombatantUid(cbt, client.getUser()); client.sendPcgMessage(uid, "COMTYPE|" + cbt.getCombatantType()); client.sendPcgMessage(uid, "CR|" + cbt.getCR()); client.sendPcgMessage(uid, "DURATION|" + cbt.getDuration()); client.sendPcgMessage(uid, "HPMAX|" + cbt.getHP().getMax()); client.sendPcgMessage(uid, "HP|" + cbt.getHP().getCurrent()); client.sendPcgMessage(uid, "HPSUB|" + cbt.getHP().getSubdual()); client.sendPcgMessage(uid, "HPSTATE|" + cbt.getHP().getState()); client.sendPcgMessage(uid, "NAME|" + cbt.getName()); client.sendPcgMessage(uid, "NUMBER|" + cbt.getNumber()); client.sendPcgMessage(uid, "PLAYER|" + cbt.getPlayer()); client.sendPcgMessage(uid, "STATUS|" + cbt.getStatus()); client.sendPcgMessage(uid, "XP|" + cbt.getXP()); client.sendPcgMessage(uid, "INITBONUS|" + cbt.init.getModifier()); client.sendPcgMessage(uid, "INIT|" + cbt.init.getCurrentInitiative()); client.sendPcgMessage(uid, "HTMLSTRING|" + cbt.toHtmlString()); } @Override public String toHtmlString() { return htmlString; } }