Crossfire JXClient, Trunk
ActiveSkillWatcher.java
Go to the documentation of this file.
1 /*
2  * This file is part of JXClient, the Fullscreen Java Crossfire Client.
3  *
4  * JXClient is free software; you can redistribute it and/or modify
5  * it under the terms of the GNU General Public License as published by
6  * the Free Software Foundation; either version 2 of the License, or
7  * (at your option) any later version.
8  *
9  * JXClient is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12  * GNU General Public License for more details.
13  *
14  * You should have received a copy of the GNU General Public License
15  * along with JXClient; if not, write to the Free Software
16  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
17  *
18  * Copyright (C) 2005-2008 Yann Chachkoff
19  * Copyright (C) 2006-2017,2019-2023 Andreas Kirschbaum
20  * Copyright (C) 2010-2012,2014-2018,2020-2023 Nicolas Weeger
21  */
22 
23 package com.realtime.crossfire.jxclient.stats;
24 
28 import org.jetbrains.annotations.NotNull;
29 
36 public class ActiveSkillWatcher {
37 
41  @NotNull
42  private static final String READIED_SKILLS = "Readied skill: ";
43 
47  @NotNull
48  private final Object sync = new Object();
49 
53  @NotNull
54  private final Stats stats;
55 
59  @NotNull
60  private String activeSkill = "";
61 
65  @NotNull
66  @SuppressWarnings("FieldCanBeLocal")
67  private final StatsListener statsListener = new StatsListener() {
68 
69  @Override
70  public void resetBefore() {
71  // ignore
72  }
73 
74  @Override
75  public void resetAfter() {
76  // ignore
77  }
78 
79  @Override
80  public void statChanged(final int statNo, final int value) {
81  // ignore
82  }
83 
84  @Override
85  public void simpleWeaponSpeedChanged(final boolean simpleWeaponSpeed) {
86  // ignore
87  }
88 
89  @Override
90  public void titleChanged(@NotNull final String title) {
91  // ignore
92  }
93 
94  @Override
95  public void godNameChanged(@NotNull final String godName) {
96  // ignore
97  }
98 
99  @Override
100  public void rangeChanged(@NotNull final String range) {
101  checkRange(range);
102  }
103 
104  @Override
105  public void activeSkillChanged(@NotNull final String activeSkill) {
106  // ignore
107  }
108 
109  @Override
110  public void experienceChanged(final long exp) {
111  // ignore
112  }
113 
114  @Override
115  public void experienceNextLevelChanged(final long expNextLevel) {
116  // ignore
117  }
118 
119  };
120 
124  @NotNull
125  @SuppressWarnings("FieldCanBeLocal")
126  private final CrossfireDrawinfoListener drawinfoListener = (text, type) -> checkMessage(text);
127 
131  @NotNull
132  @SuppressWarnings("FieldCanBeLocal")
134 
135  @Override
136  public void commandDrawextinfoReceived(final int color, final int type, final int subtype, @NotNull final String message) {
137  checkMessage(message);
138  }
139 
140  @Override
141  public void setDebugMode(final boolean printMessageTypes) {
142  // ignore
143  }
144 
145  };
146 
152  public ActiveSkillWatcher(@NotNull final Stats stats, @NotNull final CrossfireServerConnection crossfireServerConnection) {
153  this.stats = stats;
155  crossfireServerConnection.addCrossfireDrawinfoListener(drawinfoListener);
156  crossfireServerConnection.addCrossfireDrawextinfoListener(drawextinfoListener);
157  setActive("");
158  }
159 
164  private void checkRange(@NotNull final String range) {
165  if (range.startsWith("Skill: ")) {
166  setActive(range.substring(7));
167  }
168  }
169 
174  private void checkMessage(@NotNull final String message) {
175  if (message.startsWith(READIED_SKILLS)) {
176  final String tmp = message.substring(READIED_SKILLS.length());
177  setActive(tmp.endsWith(".") ? tmp.substring(0, tmp.length()-1) : tmp);
178  }
179  }
180 
185  private void setActive(@NotNull final String activeSkill) {
186  // Normalize skill name: the Crossfire server sometimes sends "Skill:
187  // <skill item name>" rather than "Skill: <skill name>".
188  final String normalizedActiveSkill;
189  switch (activeSkill) {
190  case "lockpicks":
191  normalizedActiveSkill = "lockpicking";
192  break;
193 
194  case "writing pen":
195  normalizedActiveSkill = "inscription";
196  break;
197 
198  default:
199  normalizedActiveSkill = activeSkill;
200  break;
201  }
202 
203  synchronized (sync) {
204  if (this.activeSkill.equals(normalizedActiveSkill)) {
205  return;
206  }
207 
208  this.activeSkill = normalizedActiveSkill;
209  stats.setActiveSkill(this.activeSkill);
210  }
211  }
212 
213 }
com.realtime.crossfire.jxclient
com.realtime.crossfire.jxclient.stats.ActiveSkillWatcher.drawextinfoListener
final CrossfireDrawextinfoListener drawextinfoListener
Definition: ActiveSkillWatcher.java:133
com.realtime.crossfire.jxclient.server
com.realtime.crossfire.jxclient.stats.Stats.setActiveSkill
void setActiveSkill(@NotNull final String activeSkill)
Definition: Stats.java:900
com.realtime.crossfire.jxclient.stats.ActiveSkillWatcher.checkRange
void checkRange(@NotNull final String range)
Definition: ActiveSkillWatcher.java:164
com.realtime.crossfire.jxclient.server.crossfire.CrossfireDrawextinfoListener
Definition: CrossfireDrawextinfoListener.java:33
com.realtime.crossfire.jxclient.server.crossfire.CrossfireDrawinfoListener
Definition: CrossfireDrawinfoListener.java:33
com.realtime.crossfire.jxclient.stats.Stats
Definition: Stats.java:44
com.realtime.crossfire.jxclient.stats.StatsListener
Definition: StatsListener.java:32
com.realtime.crossfire.jxclient.server.crossfire.CrossfireServerConnection
Definition: CrossfireServerConnection.java:37
com.realtime.crossfire.jxclient.stats.ActiveSkillWatcher.setActive
void setActive(@NotNull final String activeSkill)
Definition: ActiveSkillWatcher.java:185
com.realtime.crossfire.jxclient.stats.ActiveSkillWatcher.checkMessage
void checkMessage(@NotNull final String message)
Definition: ActiveSkillWatcher.java:174
com.realtime.crossfire.jxclient.stats.Stats.addCrossfireStatsListener
void addCrossfireStatsListener(@NotNull final StatsListener statsListener)
Definition: Stats.java:963
com.realtime.crossfire.jxclient.server.crossfire
Definition: AbstractCrossfireServerConnection.java:23
com.realtime.crossfire.jxclient.stats.ActiveSkillWatcher.READIED_SKILLS
static final String READIED_SKILLS
Definition: ActiveSkillWatcher.java:42
com.realtime.crossfire.jxclient.stats.ActiveSkillWatcher
Definition: ActiveSkillWatcher.java:36
com.realtime.crossfire
com.realtime
com.realtime.crossfire.jxclient.stats.ActiveSkillWatcher.ActiveSkillWatcher
ActiveSkillWatcher(@NotNull final Stats stats, @NotNull final CrossfireServerConnection crossfireServerConnection)
Definition: ActiveSkillWatcher.java:152
com
com.realtime.crossfire.jxclient.stats.ActiveSkillWatcher.drawinfoListener
final CrossfireDrawinfoListener drawinfoListener
Definition: ActiveSkillWatcher.java:126
com.realtime.crossfire.jxclient.stats.ActiveSkillWatcher.activeSkill
String activeSkill
Definition: ActiveSkillWatcher.java:60
com.realtime.crossfire.jxclient.stats.ActiveSkillWatcher.statsListener
final StatsListener statsListener
Definition: ActiveSkillWatcher.java:67
com.realtime.crossfire.jxclient.stats.ActiveSkillWatcher.stats
final Stats stats
Definition: ActiveSkillWatcher.java:54
com.realtime.crossfire.jxclient.stats.ActiveSkillWatcher.sync
final Object sync
Definition: ActiveSkillWatcher.java:48