Crossfire JXClient, Trunk
CfItem.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.items;
24 
28 import org.jetbrains.annotations.NotNull;
29 
37 public class CfItem {
38 
42  private final int tag;
43 
47  private int flags;
48 
52  private int weight;
53 
57  @NotNull
58  private Face face;
59 
63  @NotNull
64  private String name;
65 
69  @NotNull
70  private String namePl;
71 
75  private int anim;
76 
80  private int animSpeed;
81 
85  private int nrof;
86 
90  private int location;
91 
95  private final int type;
96 
101  private boolean modified = true;
102 
106  private boolean marked;
107 
111  public static final int F_APPLIED = 0x000F;
112 
116  public static final int F_UNIDENTIFIED = 0x0010;
117 
121  public static final int F_READ = 0x0020;
122 
126  public static final int F_BLESSED = 0x0100;
127 
131  public static final int F_UNPAID = 0x0200;
132 
136  public static final int F_MAGIC = 0x0400;
137 
141  public static final int F_CURSED = 0x0800;
142 
146  public static final int F_DAMNED = 0x1000;
147 
151  public static final int F_OPEN = 0x2000;
152 
156  public static final int F_NOPICK = 0x4000;
157 
161  public static final int F_LOCKED = 0x8000;
162 
167 
182  public CfItem(final int location, final int tag, 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, final int type) {
183  this.location = location;
184  this.tag = tag;
185  this.flags = flags;
186  this.weight = weight;
187  this.face = face;
188  this.name = name;
189  this.namePl = namePl;
190  this.anim = anim;
191  this.animSpeed = animSpeed;
192  this.nrof = nrof;
193  this.type = type;
194  }
195 
200  private void setFlags(final int flags) {
201  if (this.flags != flags) {
202  this.flags = flags;
203  modified = true;
204  }
205  }
206 
211  private void setWeight(final int weight) {
212  if (this.weight != weight) {
213  this.weight = weight;
214  modified = true;
215  }
216  }
217 
222  private void setFace(@NotNull final Face face) {
223  if (this.face != face) {
224  this.face = face;
225  modified = true;
226  }
227  }
228 
234  private void setName(@NotNull final String name, @NotNull final String namePl) {
235  if (!this.name.equals(name) || !this.namePl.equals(namePl)) {
236  this.name = name;
237  this.namePl = namePl;
238  modified = true;
239  }
240  }
241 
246  private void setAnim(final int anim) {
247  if (this.anim != anim) {
248  this.anim = anim;
249  modified = true;
250  }
251  }
252 
257  private void setAnimSpeed(final int animSpeed) {
258  if (this.animSpeed != animSpeed) {
259  this.animSpeed = animSpeed;
260  modified = true;
261  }
262  }
263 
268  private void setNrOf(final int nrof) {
269  if (this.nrof != nrof) {
270  this.nrof = nrof;
271  modified = true;
272  }
273  }
274 
279  public void setLocation(final int location) {
280  this.location = location;
281  }
282 
287  public int getTag() {
288  return tag;
289  }
290 
295  public int getWeight() {
296  return weight;
297  }
298 
303  @NotNull
304  public Face getFace() {
305  return face;
306  }
307 
312  @NotNull
313  public String getName() {
314  return nrof > 1 ? namePl : name;
315  }
316 
321  public int getAnim() {
322  return anim;
323  }
324 
329  public int getAnimSpeed() {
330  return animSpeed;
331  }
332 
337  public int getNrOf() {
338  return nrof;
339  }
340 
345  public boolean isApplied() {
346  return (flags&F_APPLIED) != 0;
347  }
348 
353  public boolean isUnidentified() {
354  return (flags&F_UNIDENTIFIED) != 0;
355  }
356 
361  public boolean isBlessed() {
362  return (flags&F_BLESSED) != 0;
363  }
364 
369  public boolean isUnpaid() {
370  return (flags&F_UNPAID) != 0;
371  }
372 
377  public boolean isMagic() {
378  return (flags&F_MAGIC) != 0;
379  }
380 
385  public boolean isCursed() {
386  return (flags&F_CURSED) != 0;
387  }
388 
393  public boolean isDamned() {
394  return (flags&F_DAMNED) != 0;
395  }
396 
401  public boolean isOpen() {
402  return (flags&F_OPEN) != 0;
403  }
404 
409  public boolean isNoPick() {
410  return (flags&F_NOPICK) != 0;
411  }
412 
417  public boolean isLocked() {
418  return (flags&F_LOCKED) != 0;
419  }
420 
425  public boolean isMarked() {
426  return marked;
427  }
428 
433  public void setMarked(final boolean marked) {
434  if (this.marked == marked) {
435  return;
436  }
437  this.marked = marked;
438  fireModified();
439  }
440 
445  public int getLocation() {
446  return location;
447  }
448 
453  public int getType() {
454  return type;
455  }
456 
470  public 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, final boolean clearMarked) {
471  if ((updateFlags&UpdItem.UPD_FLAGS) != 0) {
472  setFlags(flags);
473  }
474  if ((updateFlags&UpdItem.UPD_WEIGHT) != 0) {
475  setWeight(weight);
476  }
477  if ((updateFlags&UpdItem.UPD_FACE) != 0) {
478  setFace(face);
479  }
480  if ((updateFlags&UpdItem.UPD_NAME) != 0) {
481  setName(name, namePl);
482  }
483  if ((updateFlags&UpdItem.UPD_ANIM) != 0) {
484  setAnim(anim);
485  }
486  if ((updateFlags&UpdItem.UPD_ANIMSPEED) != 0) {
488  }
489  if ((updateFlags&UpdItem.UPD_NROF) != 0) {
490  setNrOf(nrof);
491  }
492  if (clearMarked) {
493  marked = false;
494  }
495  fireModified();
496  }
497 
501  private void fireModified() {
502  if (!modified) {
503  return;
504  }
505  modified = false;
506 
507  for (CfItemListener listener : listeners) {
508  listener.itemModified();
509  }
510  }
511 
517  public void addCfItemModifiedListener(@NotNull final CfItemListener listener) {
518  listeners.add(listener);
519  }
520 
525  public void removeCfItemModifiedListener(@NotNull final CfItemListener listener) {
526  listeners.remove(listener);
527  }
528 
533  @NotNull
534  public String getTooltipText() {
535  final String tooltipText1 = getTooltipText1();
536  final String tooltipText2 = getTooltipText2();
537  final String tooltipText3 = getTooltipText3();
538  final StringBuilder sb = new StringBuilder(tooltipText1);
539  if (!tooltipText2.isEmpty()) {
540  sb.append("<br>");
541  sb.append(tooltipText2);
542  }
543  if (!tooltipText3.isEmpty()) {
544  sb.append("<br>");
545  sb.append(tooltipText3);
546  }
547  return sb.toString();
548  }
549 
554  @NotNull
555  public String getTooltipText1() {
556  return nrof > 1 ? nrof+" "+namePl : name;
557  }
558 
563  @NotNull
564  public String getTooltipText2() {
565  final int totalWeight = nrof > 0 ? weight*nrof : weight;
566  if (totalWeight <= 0) {
567  return "";
568  }
569  if (totalWeight < 1000) {
570  return totalWeight+" g";
571  }
572  if (totalWeight < 10000) {
573  final int tmp = (totalWeight+50)/100;
574  return tmp/10+"."+tmp%10+" kg";
575  }
576  final int tmp = (totalWeight+500)/1000;
577  return tmp+" kg";
578  }
579 
584  @NotNull
585  public String getTooltipText3() {
586  final StringBuilder sb = new StringBuilder();
587  appendFlag(sb, F_UNIDENTIFIED, "unidentified");
588  appendFlag(sb, F_BLESSED, "blessed");
589  appendFlag(sb, F_MAGIC, "magic");
590  appendFlag(sb, F_CURSED, "cursed");
591  appendFlag(sb, F_DAMNED, "damned");
592  appendFlag(sb, F_UNPAID, "unpaid");
593  appendFlag(sb, F_READ, "read");
594  if (marked) {
595  sb.append("(marked)");
596  }
597  return sb.toString();
598  }
599 
606  private void appendFlag(@NotNull final StringBuilder sb, final int flag, @NotNull final String ident) {
607  if ((flags&flag) != 0) {
608  sb.append('(');
609  sb.append(ident);
610  sb.append(')');
611  }
612  }
613 
619  public boolean isItemGroupButton() {
620  return flags == 0 && weight == -1 && nrof == 0 && type == 0 && name.startsWith("Click here to see ");
621  }
622 
623 }
com.realtime.crossfire.jxclient.items.CfItem.getFace
Face getFace()
Returns the face.
Definition: CfItem.java:304
com.realtime.crossfire.jxclient.items.CfItem.listeners
final EventListenerList2< CfItemListener > listeners
The listeners to be notified.
Definition: CfItem.java:166
com.realtime.crossfire.jxclient.items.CfItem.update
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, final boolean clearMarked)
Processes an "upditem" command.
Definition: CfItem.java:470
com.realtime.crossfire.jxclient
com.realtime.crossfire.jxclient.items.CfItem.isMagic
boolean isMagic()
Returns whether this item is magical.
Definition: CfItem.java:377
com.realtime.crossfire.jxclient.items.CfItem.removeCfItemModifiedListener
void removeCfItemModifiedListener(@NotNull final CfItemListener listener)
Remove a.
Definition: CfItem.java:525
com.realtime.crossfire.jxclient.items.CfItem.isApplied
boolean isApplied()
Returns whether this item is applied.
Definition: CfItem.java:345
com.realtime.crossfire.jxclient.items.CfItem.F_LOCKED
static final int F_LOCKED
The flags value for locked items.
Definition: CfItem.java:161
com.realtime.crossfire.jxclient.faces.Face
A.
Definition: Face.java:37
com.realtime.crossfire.jxclient.protocol.UpdItem.UPD_FACE
int UPD_FACE
The update flags value for face updates.
Definition: UpdItem.java:49
com.realtime.crossfire.jxclient.items.CfItem.setName
void setName(@NotNull final String name, @NotNull final String namePl)
Updates the name.
Definition: CfItem.java:234
com.realtime.crossfire.jxclient.items.CfItem.isMarked
boolean isMarked()
Returns whether this item is marked.
Definition: CfItem.java:425
com.realtime.crossfire.jxclient.items.CfItem.isLocked
boolean isLocked()
Returns whether this item is locked.
Definition: CfItem.java:417
com.realtime.crossfire.jxclient.items.CfItem.type
final int type
The type.
Definition: CfItem.java:95
com.realtime.crossfire.jxclient.items.CfItem.F_UNIDENTIFIED
static final int F_UNIDENTIFIED
The flags value for unidentified items.
Definition: CfItem.java:116
com.realtime.crossfire.jxclient.items.CfItem.getType
int getType()
Returns the type.
Definition: CfItem.java:453
com.realtime.crossfire.jxclient.items.CfItem.face
Face face
The face.
Definition: CfItem.java:58
com.realtime.crossfire.jxclient.protocol.UpdItem.UPD_ANIMSPEED
int UPD_ANIMSPEED
The update flags value for animation speed updates.
Definition: UpdItem.java:64
com.realtime.crossfire.jxclient.protocol.UpdItem.UPD_NAME
int UPD_NAME
The update flags value for name updates.
Definition: UpdItem.java:54
com.realtime.crossfire.jxclient.items.CfItem.setAnim
void setAnim(final int anim)
Updates the animation.
Definition: CfItem.java:246
com.realtime.crossfire.jxclient.items.CfItem.location
int location
The location.
Definition: CfItem.java:90
com.realtime.crossfire.jxclient.items.CfItem.getWeight
int getWeight()
Returns the weight.
Definition: CfItem.java:295
com.realtime.crossfire.jxclient.items.CfItem.F_DAMNED
static final int F_DAMNED
The flags value for damned items.
Definition: CfItem.java:146
com.realtime.crossfire.jxclient.items.CfItem.nrof
int nrof
The number of objects in the stack.
Definition: CfItem.java:85
com.realtime.crossfire.jxclient.protocol.UpdItem
Interface defining constants for the "upditem" Crossfire protocol message.
Definition: UpdItem.java:29
com.realtime.crossfire.jxclient.items.CfItem.marked
boolean marked
Whether this item is marked by the player.
Definition: CfItem.java:106
com.realtime.crossfire.jxclient.faces
Manages image information ("faces") needed to display the map view, items, and spell icons.
Definition: AbstractFaceQueue.java:23
com.realtime.crossfire.jxclient.items.CfItem.F_BLESSED
static final int F_BLESSED
The flags value for blessed items.
Definition: CfItem.java:126
com.realtime.crossfire.jxclient.items.CfItem.fireModified
void fireModified()
Notify all listener.
Definition: CfItem.java:501
com.realtime.crossfire.jxclient.items.CfItem.getTooltipText3
String getTooltipText3()
Returns the third line of the tooltip text.
Definition: CfItem.java:585
com.realtime.crossfire.jxclient.util.EventListenerList2
A list of event listeners.
Definition: EventListenerList2.java:37
com.realtime.crossfire.jxclient.items.CfItemListener
Interface for listeners for attribute changes of CfItems.
Definition: CfItemListener.java:31
com.realtime.crossfire.jxclient.items.CfItem.getTooltipText
String getTooltipText()
Returns a description suitable for a tooltip text.
Definition: CfItem.java:534
com.realtime.crossfire.jxclient.protocol
Definition: MagicMap.java:23
com.realtime.crossfire.jxclient.items.CfItem.isOpen
boolean isOpen()
Returns whether this item is an opened container.
Definition: CfItem.java:401
com.realtime.crossfire.jxclient.items.CfItem.F_UNPAID
static final int F_UNPAID
The flags value for unpaid items.
Definition: CfItem.java:131
com.realtime.crossfire.jxclient.items.CfItem.F_MAGIC
static final int F_MAGIC
The flags value for magical items.
Definition: CfItem.java:136
com.realtime.crossfire.jxclient.items.CfItem.getTooltipText2
String getTooltipText2()
Returns the second line of the tooltip text.
Definition: CfItem.java:564
com.realtime.crossfire.jxclient.items.CfItem.animSpeed
int animSpeed
The animation speed.
Definition: CfItem.java:80
com.realtime.crossfire.jxclient.items.CfItem
The representation of a Crossfire Item, client-side.
Definition: CfItem.java:37
com.realtime.crossfire.jxclient.items.CfItem.isItemGroupButton
boolean isItemGroupButton()
Returns whether this object is a fake object for selecting object groups in the ground view.
Definition: CfItem.java:619
com.realtime.crossfire.jxclient.items.CfItem.getName
String getName()
Returns the name.
Definition: CfItem.java:313
com.realtime.crossfire.jxclient.items.CfItem.getTag
int getTag()
Returns the tag.
Definition: CfItem.java:287
com.realtime.crossfire.jxclient.items.CfItem.setWeight
void setWeight(final int weight)
Updates the weight.
Definition: CfItem.java:211
com.realtime.crossfire.jxclient.protocol.UpdItem.UPD_FLAGS
int UPD_FLAGS
The update flags value for flags updates.
Definition: UpdItem.java:39
com.realtime.crossfire.jxclient.items.CfItem.isUnidentified
boolean isUnidentified()
Returns whether this item is unidentified.
Definition: CfItem.java:353
com.realtime.crossfire.jxclient.items.CfItem.getAnim
int getAnim()
Returns the animation.
Definition: CfItem.java:321
com.realtime.crossfire.jxclient.items.CfItem.isCursed
boolean isCursed()
Returns whether this item is cursed.
Definition: CfItem.java:385
com.realtime.crossfire.jxclient.items.CfItem.addCfItemModifiedListener
void addCfItemModifiedListener(@NotNull final CfItemListener listener)
Add a.
Definition: CfItem.java:517
com.realtime.crossfire.jxclient.items.CfItem.namePl
String namePl
The plural name.
Definition: CfItem.java:70
com.realtime.crossfire.jxclient.util
Definition: Codec.java:23
com.realtime.crossfire.jxclient.items.CfItem.anim
int anim
The animation.
Definition: CfItem.java:75
com.realtime.crossfire.jxclient.items.CfItem.setAnimSpeed
void setAnimSpeed(final int animSpeed)
Updates the animation speed.
Definition: CfItem.java:257
com.realtime.crossfire.jxclient.protocol.UpdItem.UPD_NROF
int UPD_NROF
The update flags value for nrof updates.
Definition: UpdItem.java:69
com.realtime.crossfire.jxclient.items.CfItem.setNrOf
void setNrOf(final int nrof)
Updates the number of objects in the stack.
Definition: CfItem.java:268
com.realtime.crossfire.jxclient.items.CfItem.F_READ
static final int F_READ
The flags value for read items.
Definition: CfItem.java:121
com.realtime.crossfire.jxclient.items.CfItem.name
String name
The singular name.
Definition: CfItem.java:64
com.realtime.crossfire.jxclient.items.CfItem.setFace
void setFace(@NotNull final Face face)
Updates the face.
Definition: CfItem.java:222
com.realtime.crossfire.jxclient.items.CfItem.setMarked
void setMarked(final boolean marked)
Sets whether this item is marked.
Definition: CfItem.java:433
com.realtime.crossfire.jxclient.items.CfItem.isNoPick
boolean isNoPick()
Returns whether this item cannot be picked up.
Definition: CfItem.java:409
com.realtime.crossfire.jxclient.items.CfItem.CfItem
CfItem(final int location, final int tag, 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, final int type)
Creates a new instance.
Definition: CfItem.java:182
com.realtime.crossfire
com.realtime.crossfire.jxclient.protocol.UpdItem.UPD_ANIM
int UPD_ANIM
The update flags value for animation updates.
Definition: UpdItem.java:59
com.realtime.crossfire.jxclient.items.CfItem.isDamned
boolean isDamned()
Returns whether this item is damned.
Definition: CfItem.java:393
com.realtime
com
com.realtime.crossfire.jxclient.items.CfItem.getLocation
int getLocation()
Returns the location.
Definition: CfItem.java:445
com.realtime.crossfire.jxclient.items.CfItem.isBlessed
boolean isBlessed()
Returns whether this item is blessed.
Definition: CfItem.java:361
com.realtime.crossfire.jxclient.items.CfItem.appendFlag
void appendFlag(@NotNull final StringBuilder sb, final int flag, @NotNull final String ident)
Appends "(<ident>)" if this item has the flag.
Definition: CfItem.java:606
com.realtime.crossfire.jxclient.items.CfItem.weight
int weight
The weight.
Definition: CfItem.java:52
com.realtime.crossfire.jxclient.protocol.UpdItem.UPD_WEIGHT
int UPD_WEIGHT
The update flags value for weight updates.
Definition: UpdItem.java:44
com.realtime.crossfire.jxclient.items.CfItem.F_APPLIED
static final int F_APPLIED
The flags mask for applied states.
Definition: CfItem.java:111
com.realtime.crossfire.jxclient.items.CfItem.setLocation
void setLocation(final int location)
Updates the location.
Definition: CfItem.java:279
com.realtime.crossfire.jxclient.items.CfItem.F_NOPICK
static final int F_NOPICK
The flags value for non-pickable items.
Definition: CfItem.java:156
com.realtime.crossfire.jxclient.items.CfItem.F_CURSED
static final int F_CURSED
The flags value for cursed items.
Definition: CfItem.java:141
com.realtime.crossfire.jxclient.items.CfItem.isUnpaid
boolean isUnpaid()
Returns whether this item is unpaid.
Definition: CfItem.java:369
com.realtime.crossfire.jxclient.items.CfItem.F_OPEN
static final int F_OPEN
The flags value for opened items.
Definition: CfItem.java:151
com.realtime.crossfire.jxclient.items.CfItem.setFlags
void setFlags(final int flags)
Updates the flags.
Definition: CfItem.java:200
com.realtime.crossfire.jxclient.items.CfItem.modified
boolean modified
Set if any attribute has changed since the last time listeners were notified.
Definition: CfItem.java:101
com.realtime.crossfire.jxclient.items.CfItem.flags
int flags
The flags.
Definition: CfItem.java:47
com.realtime.crossfire.jxclient.items.CfItem.tag
final int tag
The tag.
Definition: CfItem.java:42
com.realtime.crossfire.jxclient.items.CfItem.getAnimSpeed
int getAnimSpeed()
Returns the animation speed.
Definition: CfItem.java:329
com.realtime.crossfire.jxclient.items.CfItem.getTooltipText1
String getTooltipText1()
Returns the first line of the tooltip text.
Definition: CfItem.java:555
com.realtime.crossfire.jxclient.items.CfItem.getNrOf
int getNrOf()
Returns the number of objects in this item stack.
Definition: CfItem.java:337