package client; import constants.GameConstants; import java.sql.SQLException; import java.util.LinkedHashMap; import java.util.LinkedList; import java.util.List; import java.util.Map; import java.util.Map.Entry; import server.CharacterCardFactory; import tools.Pair; import tools.Triple; import tools.data.MaplePacketLittleEndianWriter; /** * * @author AlphaEta */ public class MapleCharacterCards { private Map<Integer, CardData> cards = new LinkedHashMap<>(); // order private final List<Pair<Integer, Integer>> skills = new LinkedList<>(); // id, level public final Map<Integer, CardData> getCards() { return cards; } public final void setCards(final Map<Integer, CardData> cads) { this.cards = cads; } public final List<Pair<Integer, Integer>> getCardEffects() { return skills; } public final void calculateEffects() { skills.clear(); // reset int deck1amount = 0, deck2amount = 0; int lowD1 = 0, lowD2 = 0; List<Integer> cardids1 = new LinkedList<>(); List<Integer> cardids2 = new LinkedList<>(); for (Entry<Integer, CardData> x : cards.entrySet()) { if (x.getValue().cid > 0) { // exist final Triple<Integer, Integer, Integer> skillData = CharacterCardFactory.getInstance().getCardSkill(x.getValue().job, x.getValue().level); if (x.getKey() < 4) { if (skillData != null) { cardids1.add(skillData.getLeft()); skills.add(new Pair<>(skillData.getMid(), skillData.getRight())); } deck1amount++; if (lowD1 == 0 || lowD1 > x.getValue().level) { lowD1 = x.getValue().level; // take lowest } } else { if (skillData != null) { cardids2.add(skillData.getLeft()); skills.add(new Pair<>(skillData.getMid(), skillData.getRight())); } deck2amount++; if (lowD2 == 0 || lowD2 > x.getValue().level) { lowD2 = x.getValue().level; // take lowest } } } } if (deck1amount == 3 && cardids1.size() == 3) { final List<Integer> uid = CharacterCardFactory.getInstance().getUniqueSkills(cardids1); for (final Integer ii : uid) { skills.add(new Pair<>(ii, GameConstants.getSkillLevel(lowD1))); // we can have more than 1 unique skills } skills.add(new Pair<>(CharacterCardFactory.getInstance().getRankSkill(lowD1), 1)); } if (deck2amount == 3 && cardids2.size() == 3) { final List<Integer> uid = CharacterCardFactory.getInstance().getUniqueSkills(cardids2); for (final Integer ii : uid) { skills.add(new Pair<>(ii, GameConstants.getSkillLevel(lowD2))); } skills.add(new Pair<>(CharacterCardFactory.getInstance().getRankSkill(lowD2), 1)); } } public final void recalcLocalStats(final MapleCharacter chr) { int pos = -1; for (Entry<Integer, CardData> x : cards.entrySet()) { if (x.getValue().cid == chr.getId()) { pos = x.getKey(); break; } } if (pos != -1) { if (!CharacterCardFactory.getInstance().canHaveCard(chr.getLevel(), chr.getJob())) { cards.remove(pos); // we don't need to reset pos as its not needed } else { cards.put(pos, new CardData(chr.getId(), chr.getLevel(), chr.getJob())); // override old } } calculateEffects(); // recalculate, just incase } public final void loadCards(final MapleClient c, final boolean channelserver) throws SQLException { cards = CharacterCardFactory.getInstance().loadCharacterCards(c.getAccID(), c.getWorld()); if (channelserver) { calculateEffects(); } } public final void connectData(final MaplePacketLittleEndianWriter mplew) { if (cards.isEmpty()) { // we don't show for new characters mplew.writeZeroBytes(54); // 9 x 6 return; } int poss = 0; for (final CardData i : cards.values()) { poss++; if (poss > 6) { break; } mplew.writeInt(i.cid); mplew.write(i.level); mplew.writeInt(i.job); } } }