22 package com.realtime.crossfire.jxclient.spells;
31 import java.util.ArrayList;
32 import java.util.Collections;
33 import java.util.Comparator;
34 import java.util.HashMap;
35 import java.util.Iterator;
36 import java.util.List;
38 import java.util.concurrent.CopyOnWriteArrayList;
39 import java.util.stream.Collectors;
40 import org.jetbrains.annotations.NotNull;
41 import org.jetbrains.annotations.Nullable;
70 private final List<Spell>
spells =
new CopyOnWriteArrayList<>();
110 @SuppressWarnings(
"FieldCanBeLocal")
114 public void start() {
119 public void metaserver() {
124 public void preConnecting(@NotNull
final String serverInfo) {
129 public void connecting(@NotNull
final String serverInfo) {
132 filteredSpells.clear();
141 public void connected() {
146 public void connectFailed(@NotNull
final String reason) {
175 private static final Comparator<Skill>
SKILL_COMPARATOR = (o1, o2) -> o1.toString().compareTo(o2.toString());
194 listeners.
add(listener);
202 listeners.
remove(listener);
220 public void addSpell(
final int tag,
final int level,
final int castingTime,
final int mana,
final int grace,
final int damage,
final int skill,
final int path,
final int faceNum, @NotNull
final String spellName, @NotNull
final String message) {
221 final Spell key =
new Spell(spellName, skillSet, stats);
222 key.
setParameters(faceNum, tag, message, level, castingTime, mana, grace, damage, skill, path);
224 int index = Collections.binarySearch(spells, key, spellNameComparator);
227 final Spell existingSpell;
229 existingSpell = unknownSpells.remove(spellName);
231 if (existingSpell == null) {
234 spell = existingSpell;
235 spell.
setParameters(faceNum, tag, message, level, castingTime, mana, grace, damage, skill, path);
238 spells.add(index, spell);
240 spell = spells.get(index);
241 spell.
setParameters(faceNum, tag, message, level, castingTime, mana, grace, damage, skill, path);
248 listener.spellAdded(index);
260 public void updateSpell(
final int flags,
final int tag,
final int mana,
final int grace,
final int damage) {
261 for (
final Spell spell : spells) {
262 if (spell.getTag() == tag) {
263 spell.updateParameters((flags&UPD_SP_MANA) != 0, mana, (flags&UPD_SP_GRACE) != 0, grace, (flags&UPD_SP_DAMAGE) != 0, damage);
275 for (
final Spell spell : spells) {
276 if (spell.getTag() == tag) {
291 final Spell spell = spells.remove(index);
293 unknownSpells.put(spell.
getName(), spell);
297 listener.spellRemoved(index);
313 for (
final Spell spell : spells) {
314 if (spell.getName().equals(spellName)) {
319 final Spell spell =
new Spell(spellName, skillSet, stats);
322 unknownSpells.put(spell.
getName(), spell);
333 return Collections.unmodifiableList(filteredSpells).iterator();
341 return filteredSpells.size();
352 return filteredSpells.get(index);
353 }
catch (
final IndexOutOfBoundsException ignored) {
364 for (
final Spell spell : spells) {
365 if (spell.getFaceNum() == faceNum) {
378 filteredSpells.clear();
386 if (index < 0 || index >= spellSkills.size()) {
390 final int id = skillSet.
getSkillId(spellSkills.get(index).toString());
392 if (skillFilter ==
id) {
400 listener.spellAdded(0);
408 filteredSpells.clear();
409 filteredSpells.addAll(spells.stream().filter(spell -> skillFilter == -1 || spell.getSkill() ==
skillFilter).collect(Collectors.toList()));
417 for (
final Spell spell : spells) {
419 if (skill != null && !spellSkills.contains(skill)) {
420 spellSkills.add(skill);
423 Collections.sort(spellSkills, SKILL_COMPARATOR);
424 spellSkills.add(0, skillAll);
432 return spellSkills.size();
442 return 0 <= index && index < spellSkills.size() ? spellSkills.get(index) : null;
final Comparator< Spell > spellNameComparator
A Comparator to compare Spell instances by spell path and name.
void addSpell(final int tag, final int level, final int castingTime, final int mana, final int grace, final int damage, final int skill, final int path, final int faceNum, @NotNull final String spellName, @NotNull final String message)
Adds a new spell.
static final Comparator< Skill > SKILL_COMPARATOR
Compare 2 skills.
Interface for listeners interested gui state changes.
void filterSpells()
Rebuilds the list of spells to display.
Maintains the current GuiState.
String getName()
Returns the spell name.
void updateSpell(final int flags, final int tag, final int mana, final int grace, final int damage)
Updates spell information.
A list of event listeners.
final Skill skillAll
Dummy skill for "all skills".
final List< Spell > filteredSpells
Spells currently exposed, based on the filter.
void selectCharacter()
An character name was sent to the server.
Interface for listeners interested in SpellsManager events.
SpellsManager(@NotNull final GuiStateManager guiStateManager, @NotNull final SkillSet skillSet, @NotNull final Stats stats)
Creates a new instance.
int getSpells()
Returns the number of known spells.
Manages all known spells.
final Map< String, Spell > unknownSpells
All unknown spells that have been referenced before.
void deleteSpell(final int tag)
Deletes a spell.
final List< Spell > spells
All known spells.
static final int UPD_SP_GRACE
Flag for updspell command: grace is present.
static final int UPD_SP_MANA
Flag for updspell command: mana is present.
One skill of the character.
Iterator< Spell > iterator()
void removeCrossfireSpellChangedListener(@NotNull final SpellsManagerListener listener)
Removes a SpellsManagerListener to notify about changes.
int getSkillId(final String name)
Get a skill identifier from the skill name.
final EventListenerList2< SpellsManagerListener > listeners
The SpellsManagerListeners to notify about changes.
void setParameters(final int faceNum, final int tag, @NotNull final String message, final int level, final int castingTime, final int mana, final int grace, final int damage, final int skill, final int path)
Updates the spell's parameters.
Describes a Crossfire spell.
void deleteSpellByIndex(final int index)
Deletes a spell by index into spells.
void addCrossfireSpellChangedListener(@NotNull final SpellsManagerListener listener)
Adds a SpellsManagerListener to notify about changes.
final SkillSet skillSet
The SkillSet containing skills from the server.
A Comparator to compare Spell instances by spell path and name.
void add(@NotNull final T listener)
Adds a listener.
Skill getSkill(final int id)
Returns the given skill as a Skill object.
void rebuildSkills()
Rebuilds the list of skills from the spells.
int getSpellSkills()
Returns the number of spell skills.
static final int UPD_SP_DAMAGE
Flag for updspell command: damage is present.
void filterSkill(final int index)
Filters spells to display by the specified skill index.
final List< Skill > spellSkills
Skills used by the spell, including the "all" skill.
int skillFilter
Skill to filter spells by, as a skill id in SkillSet.
This is the representation of all the statistics of a player, like its speed or its experience...
final Stats stats
The Stats for the player.
Skill getSpellSkill(final int index)
Returns the specified spell skill.
Maintain the set of skills as sent by the server.
void setUnknown(final boolean unknown)
Marks this spell as known or unknown for the character.
boolean displaysFace(final int faceNum)
Returns whether any spell has the given face.
void remove(@NotNull final T listener)
Removes a listener.
Connection progress states of the Crossfire server connection.
final GuiStateListener guiStateListener
The GuiStateListener for detecting established or dropped connections.
Spell getSpell(final int index)
Returns a Spell instance by index.
Spell getSpell(@NotNull final String spellName)
Returns a Spell instance by spell name.