1 /*************************************************************************** 2 * (C) Copyright 2003-2010 - Stendhal * 3 *************************************************************************** 4 *************************************************************************** 5 * * 6 * This program is free software; you can redistribute it and/or modify * 7 * it under the terms of the GNU General Public License as published by * 8 * the Free Software Foundation; either version 2 of the License, or * 9 * (at your option) any later version. * 10 * * 11 ***************************************************************************/ 12 package games.stendhal.client.gui.group; 13 14 import javax.swing.event.ChangeEvent; 15 import javax.swing.event.ChangeListener; 16 17 import games.stendhal.client.gui.LinearScalingModel; 18 19 /** 20 * Represents a group member. Present members are those that the client has 21 * direct information about, ie. the players on the same zone. 22 */ 23 class Member implements Comparable<Member> { 24 private final String name; 25 private boolean leader; 26 private boolean present; 27 /** Model for detecting which HP changes are significant */ 28 private final LinearScalingModel hpModel = new LinearScalingModel(); 29 /** Listener that needs to be notified about significant HP changes. */ 30 private ChangeListener listener; 31 32 /** 33 * Create a new member. 34 * 35 * @param name name of the buddy 36 */ Member(String name)37 Member(String name) { 38 this.name = name; 39 hpModel.addChangeListener(new ChangeListener() { 40 @Override 41 public void stateChanged(ChangeEvent e) { 42 if (listener != null) { 43 // redispatch as a change coming from this member 44 listener.stateChanged(new ChangeEvent(Member.this)); 45 } 46 } 47 }); 48 } 49 50 /** 51 * Get the name of the member. 52 * 53 * @return name 54 */ getName()55 String getName() { 56 return name; 57 } 58 59 /** 60 * Check if the member is the group leader. 61 * 62 * @return <code>true</code> if the member is the group leader, 63 * <code>false</code> otherwise 64 */ isLeader()65 boolean isLeader() { 66 return leader; 67 } 68 69 /** 70 * Set the leader status of the group member. 71 * 72 * @param status the new leader status 73 * @return <code>true</code> if the leader changed, <code>false</code> 74 * otherwise 75 */ setLeader(boolean status)76 boolean setLeader(boolean status) { 77 boolean changed = leader != status; 78 leader = status; 79 return changed; 80 } 81 82 /** 83 * Check if the member is present. 84 * 85 * @return <code>true</code> if the member is present, <code>false</code> 86 * otherwise 87 */ isPresent()88 boolean isPresent() { 89 return present; 90 } 91 92 /** 93 * Set the member present or absent. 94 * 95 * @param present 96 */ setPresent(boolean present)97 void setPresent(boolean present) { 98 this.present = present; 99 } 100 101 /** 102 * Get the ratio of the member's current HP vs her maximum HP. The value 103 * is reliable only if the member is present. 104 * 105 * @return HP ratio 106 */ getHpRatio()107 float getHpRatio() { 108 return (float) hpModel.getValue(); 109 } 110 111 /** 112 * Set the ratio of the member's current HP vs her maximum HP. 113 * 114 * @param ratio new HP ratio 115 */ setHpRatio(float ratio)116 void setHpRatio(float ratio) { 117 hpModel.setValue(ratio); 118 } 119 120 /** 121 * Set the listener that should be notified about changes in the member. 122 * 123 * @param listener 124 */ setChangeListener(ChangeListener listener)125 void setChangeListener(ChangeListener listener) { 126 this.listener = listener; 127 } 128 129 /** 130 * Set the maximum HP representation. Used to detect which HP ratio changes 131 * are significant. 132 * 133 * @param maxRepresentation 134 */ setMaxHPRepresentation(int maxRepresentation)135 void setMaxHPRepresentation(int maxRepresentation) { 136 hpModel.setMaxRepresentation(maxRepresentation); 137 } 138 139 @Override equals(Object obj)140 public boolean equals(Object obj) { 141 if (obj instanceof Member) { 142 return name.equals(((Member) obj).name); 143 } 144 return false; 145 } 146 147 @Override hashCode()148 public int hashCode() { 149 return name.hashCode(); 150 } 151 152 @Override compareTo(Member member)153 public int compareTo(Member member) { 154 // There really should be only one leader, but check for consistent 155 // ordering 156 if (leader != member.leader) { 157 return (leader) ? -1 : 1; 158 } 159 160 return name.compareToIgnoreCase(member.name); 161 } 162 } 163