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 com.realtime.crossfire.jxclient.timeouts.TimeoutEvent;
00028 import com.realtime.crossfire.jxclient.timeouts.Timeouts;
00029 import org.jetbrains.annotations.NotNull;
00030
00037 public class PoisonWatcher {
00038
00043 private static final int TIMEOUT_DE_ASSERT = 10000;
00044
00048 @NotNull
00049 private static final String ASSERT_MESSAGE = "You feel very sick...";
00050
00054 @NotNull
00055 private static final String DE_ASSERT_MESSAGE = "You feel much better now.";
00056
00060 @NotNull
00061 private static final String CURE_MESSAGE = "Your body feels cleansed";
00062
00066 @NotNull
00067 private final Object sync = new Object();
00068
00072 @NotNull
00073 private final Stats stats;
00074
00078 private boolean active = true;
00079
00083 @NotNull
00084 private final CrossfireDrawinfoListener drawinfoListener = new CrossfireDrawinfoListener() {
00085
00086 @Override
00087 public void commandDrawinfoReceived(@NotNull final String text, final int type) {
00088 check(text);
00089 }
00090
00091 };
00092
00096 @NotNull
00097 private final CrossfireDrawextinfoListener drawextinfoListener = new CrossfireDrawextinfoListener() {
00098
00099 @Override
00100 public void commandDrawextinfoReceived(final int color, final int type, final int subtype, @NotNull final String message) {
00101 check(message);
00102 }
00103
00104 @Override
00105 public void setDebugMode(final boolean printMessageTypes) {
00106
00107 }
00108
00109 };
00110
00115 @NotNull
00116 private final TimeoutEvent timeoutEvent = new TimeoutEvent() {
00117
00118 @Override
00119 public void timeout() {
00120 setActive(false);
00121 }
00122
00123 };
00124
00130 public PoisonWatcher(@NotNull final Stats stats, @NotNull final CrossfireServerConnection crossfireServerConnection) {
00131 this.stats = stats;
00132 crossfireServerConnection.addCrossfireDrawinfoListener(drawinfoListener);
00133 crossfireServerConnection.addCrossfireDrawextinfoListener(drawextinfoListener);
00134 setActive(false);
00135 }
00136
00141 private void check(@NotNull final String message) {
00142 if (message.equals(ASSERT_MESSAGE)) {
00143 setActive(true);
00144 } else if (message.equals(DE_ASSERT_MESSAGE) || message.equals(CURE_MESSAGE)) {
00145 setActive(false);
00146 }
00147 }
00148
00153 private void setActive(final boolean active) {
00154 synchronized (sync) {
00155 if (active) {
00156 Timeouts.reset(TIMEOUT_DE_ASSERT, timeoutEvent);
00157 } else {
00158 Timeouts.remove(timeoutEvent);
00159 }
00160
00161 if (this.active == active) {
00162 return;
00163 }
00164
00165 this.active = active;
00166 stats.setStat(Stats.C_STAT_POISONED, active ? 1 : 0);
00167 }
00168 }
00169
00170 }