22 package com.realtime.crossfire.jxclient.items;
28 import java.util.Collection;
29 import java.util.Collections;
30 import java.util.HashMap;
31 import java.util.HashSet;
32 import java.util.List;
33 import java.util.ListIterator;
35 import java.util.concurrent.CopyOnWriteArrayList;
36 import org.jetbrains.annotations.NotNull;
37 import org.jetbrains.annotations.Nullable;
50 private final Map<Integer, CfItem>
allItems =
new HashMap<>();
56 private final Map<Integer, List<CfItem>>
items =
new HashMap<>();
62 private final Object
sync =
new Object();
94 itemSetListeners.
add(listener);
102 itemSetListeners.
remove(listener);
111 itemListeners.
add(tag, listener);
120 itemListeners.
remove(tag, listener);
131 final List<CfItem> result = items.get(location);
132 if (result == null) {
133 return Collections.emptyList();
135 return Collections.unmodifiableList(result);
145 final Collection<CfItem> result = items.get(location);
146 return result == null ? 0 : result.size();
157 synchronized (
sync) {
158 final CfItem item = allItems.remove(tag);
164 listener.itemRemoved(item);
168 final List<CfItem> list = items.get(where);
170 throw new AssertionError(
"cannot find item "+item.
getTag());
173 final int index = list.indexOf(item);
174 if (list.remove(index) == null) {
175 throw new AssertionError(
"cannot find item "+item.
getTag());
178 if (list.isEmpty() && items.remove(item.
getLocation()) != list) {
179 throw new AssertionError();
183 itemListener.inventoryRemoved(where, index);
186 if (notifyListeners) {
188 listener.itemRemoved(item);
193 itemListener.itemRemoved(tag);
205 for (
final int tag : tags) {
207 System.err.println(
"removeItem3: item "+tag+
" does not exist");
226 private void addItem(@NotNull
final CfItem item,
final boolean notifyListeners) {
229 if (allItems.put(item.getTag(), item) != null) {
230 throw new AssertionError(
"duplicate item "+item.getTag());
233 final int where = item.getLocation();
234 List<CfItem> list = items.get(where);
236 list =
new CopyOnWriteArrayList<>();
237 if (items.put(where, list) != null) {
238 throw new AssertionError();
244 if (notifyListeners) {
246 listener.itemAdded(item);
251 itemListener.inventoryAdded(where, list.size()-1, item);
262 final List<CfItem> inventory = items.get(tag);
263 if (inventory == null) {
264 return Collections.emptyList();
266 return Collections.unmodifiableList(inventory);
276 return allItems.get(tag);
285 synchronized (
sync) {
295 synchronized (
sync) {
296 if (this.player == player) {
302 listener.playerChanged(player);
313 synchronized (
sync) {
325 synchronized (
sync) {
326 if (player != null && player.
getTag() == tag) {
330 return allItems.get(tag);
340 final ListIterator<CfItem> it = inventoryItems.listIterator(inventoryItems.size());
341 while (it.hasPrevious()) {
342 final CfItem item = it.previous();
361 public void updateItem(
final int flags,
final int tag,
final int valLocation,
final int valFlags,
final int valWeight,
final Face valFace, @NotNull
final String valName, @NotNull
final String valNamePl,
final int valAnim,
final int valAnimSpeed,
final int valNrof) {
362 synchronized (
sync) {
366 System.err.println(
"updateItem: undefined item "+tag);
372 item.
update(flags, valFlags, valWeight, valFace, valName, valNamePl, valAnim, valAnimSpeed, valNrof);
379 listener.itemMoved(item);
384 listener.itemChanged(item);
387 itemListener.itemChanged(tag);
393 }
else if (wasOpen) {
404 synchronized (
sync) {
405 if (player != null) {
408 final Iterable<CfItem> tmp =
new HashSet<>(allItems.values());
409 for (
final CfItem item : tmp) {
422 if (this.openContainerFloor == openContainerFloor) {
428 listener.openContainerChanged(openContainerFloor);
450 return 0 <= index && index < inventoryItems.size() ? inventoryItems.get(index) : null;
451 }
catch (
final ArrayIndexOutOfBoundsException ignored) {
final EventListenerList2< ItemSetListener > itemSetListeners
The list of ItemSetListeners to be notified about changes.
void setPlayer(@Nullable final CfItem player)
Sets the player object this client controls.
void removeItems(@NotNull final int[] tags)
Deletes items by tag.
CfItem getInventoryItem(final int tag, final int index)
Returns a CfItem from the inventory of an item.
void updateItem(final int flags, final int tag, final int valLocation, final int valFlags, final int valWeight, final Face valFace, @NotNull final String valName, @NotNull final String valNamePl, final int valAnim, final int valAnimSpeed, final int valNrof)
Processes an "upditem" command.
List< CfItem > getItemsByLocation(final int location)
Returns a list of items in a given location.
Iterable< CfItem > getPlayerInventory()
Returns the player's inventory.
int UPD_FACE
The update flags value for face updates.
A list of event listeners.
void setOpenContainer(final int openContainerFloor)
Sets the currently opened container.
int getNumberOfItemsByLocation(final int location)
Returns the number of items in a given location.
void addItemSetListener(@NotNull final ItemSetListener listener)
Adds an ItemSetListener to be notified about changes.
void remove(final int index, @NotNull final T listener)
Removes a listener.
final Map< Integer, List< CfItem > > items
Maps location (=tag) to list of items in that location.
int UPD_FLAGS
The update flags value for flags updates.
Interface for listeners for changes of item locations.
Manages image information ("faces") needed to display the map view, items, and spell icons...
CfItem getItemOrPlayer(final int tag)
Returns an item by tag.
CfItem getItemByTag(final int tag)
Returns an item by tag.
int getLocation()
Returns the location.
void removeInventoryListener(final int tag, @NotNull final ItemListener listener)
Removes an ItemListener to be notified about changes.
int getOpenContainer()
Returns the currently opened container.
void removeItemSetListener(@NotNull final ItemSetListener listener)
Removes an ItemSetListener to be notified about changes.
Interface for listeners in ItemSet related events.
void addInventoryListener(final int tag, @NotNull final ItemListener listener)
Adds an ItemListener to be notified about changes.
void reset()
Resets the manager's state.
void update(final int updateFlags, final int flags, final int weight, @NotNull final Face face, @NotNull final String name, @NotNull final String namePl, final int anim, final int animSpeed, final int nrof)
Processes an "upditem" command.
int UPD_LOCATION
The update flags value for location updates.
void add(@NotNull final T listener)
Adds a listener.
int getTag()
Returns the tag.
void addItem(@NotNull final CfItem item)
Adds an item.
CfItem getPlayer()
Returns the player object this client controls.
void addItem(@NotNull final CfItem item, final boolean notifyListeners)
Adds a CfItem.
CfItem player
The current player object this client controls.
List< CfItem > getInventoryByTag(final int tag)
Returns the inventory of an item.
void cleanInventory(final int tag)
Clears the inventory of an item.
final Map< Integer, CfItem > allItems
Maps item tags to items.
void setLocation(final int location)
Updates the location.
Interface defining constants for the "upditem" Crossfire protocol message.
Model class maintaining the CfItems known to the player.
int removeItemByTag(final int tag, final boolean notifyListeners)
Removes a CfItem.
final HashedEventListenerList< ItemListener > itemListeners
The registered ItemListeners to be notified about changes.
Iterable< T > getListeners(final int index)
Returns an array of all the listeners.
The representation of a Crossfire Item, client-side.
void remove(@NotNull final T listener)
Removes a listener.
final Object sync
The synchronization object for player.
void add(final int index, @NotNull final T listener)
Adds a listener.
int openContainerFloor
The currently opened container or.
boolean isOpen()
Returns whether this item is an opened container.