Crossfire JXClient, Trunk
MarkedItemWatcher.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 
32 import org.jetbrains.annotations.NotNull;
33 import org.jetbrains.annotations.Nullable;
34 
39 public class MarkedItemWatcher {
40 
44  @NotNull
45  private static final String MARK_MESSAGE = "Marked item ";
46 
50  @NotNull
51  private final ItemSet itemSet;
52 
56  @SuppressWarnings("FieldAccessedSynchronizedAndUnsynchronized")
57  private int currentPlayerTag;
58 
62  @NotNull
63  private final Object sync = new Object();
64 
69  private int pendingMarkedTag = -1;
70 
75  @NotNull
76  @SuppressWarnings("FieldCanBeLocal")
78 
79  @Override
80  public void commandDrawextinfoReceived(final int color, final int type, final int subtype, @NotNull final String message) {
81  check(message);
82  }
83 
84  @Override
85  public void setDebugMode(final boolean printMessageTypes) {
86  // ignore
87  }
88 
89  };
90 
94  @NotNull
95  @SuppressWarnings("FieldCanBeLocal")
97 
98  @Override
99  public void markSent(final int tag) {
100  synchronized (sync) {
101  pendingMarkedTag = tag;
102  }
103  }
104 
105  @Override
106  public void replySent() {
107  // ignore
108  }
109 
110  };
111 
116  @NotNull
117  @SuppressWarnings("FieldCanBeLocal")
119 
120  @Override
121  public void playerChanged(@Nullable final CfItem player) {
122  setCurrentPlayerTag(player == null ? -1 : player.getTag());
123  }
124 
125  @Override
126  public void openContainerChanged(final int tag) {
127  // ignore
128  }
129 
130  };
131 
135  @NotNull
137 
138  @Override
139  public void itemChanged(final int tag) {
140  if (tag != currentPlayerTag) {
141  throw new IllegalArgumentException("tag="+tag+" but expecting currentPlayerTag="+currentPlayerTag);
142  }
144  }
145 
146  @Override
147  public void itemRemoved(final int tag) {
148  // ignore; will be detected by itemSetListener
149  }
150 
151  @Override
152  public void inventoryAdded(final int tag, final int index, @NotNull final CfItem item) {
153  if (tag != currentPlayerTag) {
154  throw new IllegalArgumentException("tag="+tag+" but expecting currentPlayerTag="+currentPlayerTag);
155  }
157  }
158 
159  @Override
160  public void inventoryRemoved(final int tag, final int index) {
161  if (tag != currentPlayerTag) {
162  throw new IllegalArgumentException("tag="+tag+" but expecting currentPlayerTag="+currentPlayerTag);
163  }
165  }
166 
167  };
168 
174  public MarkedItemWatcher(@NotNull final ItemSet itemSet, @NotNull final CrossfireServerConnection crossfireServerConnection) {
175  this.itemSet = itemSet;
176  crossfireServerConnection.addCrossfireDrawinfoListener((text, type) -> check(text));
177  crossfireServerConnection.addCrossfireDrawextinfoListener(drawextinfoListener);
178  crossfireServerConnection.addSentPacketListener(sentPacketListener);
180  final CfItem player = itemSet.getPlayer();
181  currentPlayerTag = player == null ? -1 : player.getTag();
182  }
183 
188  private void check(@NotNull final String message) {
189  synchronized (sync) {
190  if (message.startsWith(MARK_MESSAGE)) {
191  if (pendingMarkedTag != -1) {
193  pendingMarkedTag = -1;
194  }
195  }
196  }
197  }
198 
203  private void setCurrentPlayerTag(final int currentPlayerTag) {
204  if (this.currentPlayerTag != currentPlayerTag) {
205  if (this.currentPlayerTag != -1) {
207  }
208  this.currentPlayerTag = currentPlayerTag;
209  if (this.currentPlayerTag != -1) {
210  itemSet.addInventoryListener(this.currentPlayerTag, playerInventoryListener);
211  }
212  }
213  }
214 
215 }
com.realtime.crossfire.jxclient
com.realtime.crossfire.jxclient.server
com.realtime.crossfire.jxclient.items.ItemSet.removeInventoryListener
void removeInventoryListener(final int tag, @NotNull final ItemListener listener)
Definition: ItemSet.java:121
com.realtime.crossfire.jxclient.stats.MarkedItemWatcher.itemSetListener
final ItemSetListener itemSetListener
Definition: MarkedItemWatcher.java:118
com.realtime.crossfire.jxclient.items.ItemSet.setMarkedItemTag
void setMarkedItemTag(final int markedItemTag)
Definition: ItemSet.java:456
com.realtime.crossfire.jxclient.items.ItemListener
Definition: ItemListener.java:32
com.realtime.crossfire.jxclient.items.ItemSet
Definition: ItemSet.java:44
com.realtime.crossfire.jxclient.server.crossfire.CrossfireDrawextinfoListener
Definition: CrossfireDrawextinfoListener.java:33
com.realtime.crossfire.jxclient.stats.MarkedItemWatcher.check
void check(@NotNull final String message)
Definition: MarkedItemWatcher.java:188
com.realtime.crossfire.jxclient.stats.MarkedItemWatcher.pendingMarkedTag
int pendingMarkedTag
Definition: MarkedItemWatcher.java:69
com.realtime.crossfire.jxclient.stats.MarkedItemWatcher.setCurrentPlayerTag
void setCurrentPlayerTag(final int currentPlayerTag)
Definition: MarkedItemWatcher.java:203
com.realtime.crossfire.jxclient.items.ItemSet.getPlayer
CfItem getPlayer()
Definition: ItemSet.java:272
com.realtime.crossfire.jxclient.stats.MarkedItemWatcher.sync
final Object sync
Definition: MarkedItemWatcher.java:63
com.realtime.crossfire.jxclient.stats.MarkedItemWatcher.MARK_MESSAGE
static final String MARK_MESSAGE
Definition: MarkedItemWatcher.java:45
com.realtime.crossfire.jxclient.stats.MarkedItemWatcher.playerInventoryListener
final ItemListener playerInventoryListener
Definition: MarkedItemWatcher.java:136
com.realtime.crossfire.jxclient.stats.MarkedItemWatcher.drawextinfoListener
final CrossfireDrawextinfoListener drawextinfoListener
Definition: MarkedItemWatcher.java:77
com.realtime.crossfire.jxclient.server.crossfire.CrossfireServerConnection
Definition: CrossfireServerConnection.java:37
com.realtime.crossfire.jxclient.stats.MarkedItemWatcher.currentPlayerTag
int currentPlayerTag
Definition: MarkedItemWatcher.java:57
com.realtime.crossfire.jxclient.items.CfItem
Definition: CfItem.java:37
com.realtime.crossfire.jxclient.stats.MarkedItemWatcher.sentPacketListener
final SentPacketListener sentPacketListener
Definition: MarkedItemWatcher.java:96
com.realtime.crossfire.jxclient.server.crossfire
Definition: AbstractCrossfireServerConnection.java:23
com.realtime.crossfire.jxclient.stats.MarkedItemWatcher
Definition: MarkedItemWatcher.java:39
com.realtime.crossfire
com.realtime.crossfire.jxclient.items.CfItem.getTag
int getTag()
Definition: CfItem.java:287
com.realtime
com.realtime.crossfire.jxclient.items.ItemSet.addInventoryListener
void addInventoryListener(final int tag, @NotNull final ItemListener listener)
Definition: ItemSet.java:112
com
com.realtime.crossfire.jxclient.items.ItemSet.addItemSetListener
void addItemSetListener(@NotNull final ItemSetListener listener)
Definition: ItemSet.java:95
com.realtime.crossfire.jxclient.stats.MarkedItemWatcher.MarkedItemWatcher
MarkedItemWatcher(@NotNull final ItemSet itemSet, @NotNull final CrossfireServerConnection crossfireServerConnection)
Definition: MarkedItemWatcher.java:174
com.realtime.crossfire.jxclient.items
Definition: AbstractItemView.java:23
com.realtime.crossfire.jxclient.stats.MarkedItemWatcher.itemSet
final ItemSet itemSet
Definition: MarkedItemWatcher.java:51
com.realtime.crossfire.jxclient.items.ItemSetListener
Definition: ItemSetListener.java:32
com.realtime.crossfire.jxclient.server.crossfire.SentPacketListener
Definition: SentPacketListener.java:31