00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022 package com.realtime.crossfire.jxclient.stats;
00023
00024 import com.realtime.crossfire.jxclient.server.crossfire.CrossfireDrawextinfoListener;
00025 import com.realtime.crossfire.jxclient.server.crossfire.CrossfireDrawinfoListener;
00026 import com.realtime.crossfire.jxclient.server.crossfire.CrossfireServerConnection;
00027 import org.jetbrains.annotations.NotNull;
00028
00035 public class ActiveSkillWatcher {
00036
00040 @NotNull
00041 private static final String READIED_SKILLS = "Readied skill: ";
00042
00046 @NotNull
00047 private final Object sync = new Object();
00048
00052 @NotNull
00053 private final Stats stats;
00054
00058 @NotNull
00059 private String activeSkill = "";
00060
00064 @NotNull
00065 private final StatsListener statsListener = new StatsListener() {
00066
00067 @Override
00068 public void reset() {
00069
00070 }
00071
00072 @Override
00073 public void statChanged(final int statNo, final int value) {
00074
00075 }
00076
00077 @Override
00078 public void simpleWeaponSpeedChanged(final boolean simpleWeaponSpeed) {
00079
00080 }
00081
00082 @Override
00083 public void titleChanged(@NotNull final String title) {
00084
00085 }
00086
00087 @Override
00088 public void rangeChanged(@NotNull final String range) {
00089 checkRange(range);
00090 }
00091
00092 @Override
00093 public void activeSkillChanged(@NotNull final String activeSkill) {
00094
00095 }
00096
00097 @Override
00098 public void experienceChanged(final long exp) {
00099
00100 }
00101
00102 @Override
00103 public void experienceNextLevelChanged(final long expNextLevel) {
00104
00105 }
00106
00107 };
00108
00112 @NotNull
00113 private final CrossfireDrawinfoListener drawinfoListener = new CrossfireDrawinfoListener() {
00114
00115 @Override
00116 public void commandDrawinfoReceived(@NotNull final String text, final int type) {
00117 checkMessage(text);
00118 }
00119
00120 };
00121
00125 @NotNull
00126 private final CrossfireDrawextinfoListener drawextinfoListener = new CrossfireDrawextinfoListener() {
00127
00128 @Override
00129 public void commandDrawextinfoReceived(final int color, final int type, final int subtype, @NotNull final String message) {
00130 checkMessage(message);
00131 }
00132
00133 @Override
00134 public void setDebugMode(final boolean printMessageTypes) {
00135
00136 }
00137
00138 };
00139
00145 public ActiveSkillWatcher(@NotNull final Stats stats, @NotNull final CrossfireServerConnection crossfireServerConnection) {
00146 this.stats = stats;
00147 stats.addCrossfireStatsListener(statsListener);
00148 crossfireServerConnection.addCrossfireDrawinfoListener(drawinfoListener);
00149 crossfireServerConnection.addCrossfireDrawextinfoListener(drawextinfoListener);
00150 setActive("");
00151 }
00152
00157 private void checkRange(@NotNull final String range) {
00158 if (range.startsWith("Skill: ")) {
00159 setActive(range.substring(7));
00160 }
00161 }
00162
00167 private void checkMessage(@NotNull final String message) {
00168 if (message.startsWith(READIED_SKILLS)) {
00169 final String tmp = message.substring(READIED_SKILLS.length());
00170 setActive(tmp.endsWith(".") ? tmp.substring(0, tmp.length()-1) : tmp);
00171 }
00172 }
00173
00178 private void setActive(@NotNull final String activeSkill) {
00179
00180
00181 final String normalizedActiveSkill;
00182 if (activeSkill.equals("lockpicks")) {
00183 normalizedActiveSkill = "lockpicking";
00184 } else if (activeSkill.equals("writing pen")) {
00185 normalizedActiveSkill = "inscription";
00186 } else {
00187 normalizedActiveSkill = activeSkill;
00188 }
00189
00190 synchronized (sync) {
00191 if (this.activeSkill.equals(normalizedActiveSkill)) {
00192 return;
00193 }
00194
00195 this.activeSkill = normalizedActiveSkill;
00196 stats.setActiveSkill(this.activeSkill);
00197 }
00198 }
00199
00200 }