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.sound;
00023
00024 import com.realtime.crossfire.jxclient.gui.gui.RendererGuiState;
00025 import com.realtime.crossfire.jxclient.gui.gui.RendererGuiStateListener;
00026 import com.realtime.crossfire.jxclient.gui.label.JXCWindowRenderer;
00027 import com.realtime.crossfire.jxclient.server.crossfire.CrossfireServerConnection;
00028 import com.realtime.crossfire.jxclient.server.crossfire.CrossfireUpdateItemListener;
00029 import com.realtime.crossfire.jxclient.stats.Stats;
00030 import com.realtime.crossfire.jxclient.stats.StatsListener;
00031 import org.jetbrains.annotations.NotNull;
00032
00037 public class StatsWatcher {
00038
00042 private static final long DELAY = 1000;
00043
00047 @NotNull
00048 private final SoundManager soundManager;
00049
00053 private boolean active;
00054
00058 private boolean poisoned;
00059
00063 private int level;
00064
00070 private long ignoreLevelChange = System.currentTimeMillis()+DELAY;
00071
00075 @NotNull
00076 private final StatsListener statsListener = new StatsListener() {
00077
00078 @Override
00079 public void reset() {
00080 ignoreLevelChange = System.currentTimeMillis()+DELAY;
00081 }
00082
00083 @Override
00084 public void statChanged(final int statNo, final int value) {
00085 checkStats(statNo, value);
00086 }
00087
00088 @Override
00089 public void simpleWeaponSpeedChanged(final boolean simpleWeaponSpeed) {
00090
00091 }
00092
00093 @Override
00094 public void titleChanged(@NotNull final String title) {
00095
00096 }
00097
00098 @Override
00099 public void rangeChanged(@NotNull final String range) {
00100
00101 }
00102
00103 @Override
00104 public void activeSkillChanged(@NotNull final String activeSkill) {
00105
00106 }
00107
00108 @Override
00109 public void experienceChanged(final long exp) {
00110
00111 }
00112
00113 @Override
00114 public void experienceNextLevelChanged(final long expNextLevel) {
00115
00116 }
00117
00118 };
00119
00123 @NotNull
00124 private final RendererGuiStateListener rendererGuiStateListener = new RendererGuiStateListener() {
00125
00126 @Override
00127 public void guiStateChanged(@NotNull final RendererGuiState rendererGuiState) {
00128 active = rendererGuiState == RendererGuiState.PLAYING;
00129 ignoreLevelChange = System.currentTimeMillis()+DELAY;
00130 }
00131
00132 };
00133
00137 @NotNull
00138 private final CrossfireUpdateItemListener crossfireUpdateItemListener = new CrossfireUpdateItemListener() {
00139
00140 @Override
00141 public void delinvReceived(final int tag) {
00142
00143 }
00144
00145 @Override
00146 public void delitemReceived(@NotNull final int[] tags) {
00147
00148 }
00149
00150 @Override
00151 public void addItemReceived(final int location, final int tag, final int flags, final int weight, final int faceNum, @NotNull final String name, @NotNull final String namePl, final int anim, final int animSpeed, final int nrof, final int type) {
00152
00153 }
00154
00155 @Override
00156 public void playerReceived(final int tag, final int weight, final int faceNum, @NotNull final String name) {
00157 ignoreLevelChange = System.currentTimeMillis()+DELAY;
00158 }
00159
00160 @Override
00161 public void upditemReceived(final int flags, final int tag, final int valLocation, final int valFlags, final int valWeight, final int valFaceNum, @NotNull final String valName, @NotNull final String valNamePl, final int valAnim, final int valAnimSpeed, final int valNrof) {
00162
00163 }
00164
00165 };
00166
00174 public StatsWatcher(@NotNull final Stats stats, @NotNull final JXCWindowRenderer windowRenderer, @NotNull final CrossfireServerConnection server, @NotNull final SoundManager soundManager) {
00175 this.soundManager = soundManager;
00176 poisoned = stats.getStat(Stats.C_STAT_POISONED) != 0;
00177 level = stats.getStat(Stats.CS_STAT_LEVEL);
00178 stats.addCrossfireStatsListener(statsListener);
00179 windowRenderer.addGuiStateListener(rendererGuiStateListener);
00180 rendererGuiStateListener.guiStateChanged(windowRenderer.getGuiState());
00181 server.addCrossfireUpdateItemListener(crossfireUpdateItemListener);
00182 }
00183
00189 private void checkStats(final int statNo, final int value) {
00190 if (statNo == Stats.C_STAT_POISONED) {
00191 final boolean newPoisoned = value != 0;
00192 if (poisoned != newPoisoned) {
00193 poisoned = newPoisoned;
00194 if (active) {
00195 playClip(newPoisoned ? Sounds.POISON_ON : Sounds.POISON_OFF);
00196 }
00197 }
00198 } else if (statNo == Stats.CS_STAT_LEVEL) {
00199 final int newLevel = value;
00200 if (level != newLevel) {
00201 if (ignoreLevelChange != 0 && ignoreLevelChange <= System.currentTimeMillis()) {
00202 ignoreLevelChange = 0;
00203 }
00204 if (ignoreLevelChange == 0 && level < newLevel && active) {
00205 playClip(Sounds.LEVEL_UP);
00206 }
00207 level = newLevel;
00208 }
00209 }
00210 }
00211
00216 private void playClip(@NotNull final String clip) {
00217 if (active) {
00218 soundManager.playClip(Sounds.CHARACTER, null, clip);
00219 }
00220 }
00221
00222 }