package handling.world; import client.MapleCharacter; import handling.channel.ChannelServer; import handling.world.sidekick.MapleSidekick; import java.util.LinkedHashMap; import java.util.Map; import java.util.concurrent.locks.ReentrantReadWriteLock; public class WorldSidekickService { private final Map<Integer, MapleSidekick> sidekickList; private final ReentrantReadWriteLock lock; public static WorldSidekickService getInstance() { return SingletonHolder.instance; } private WorldSidekickService() { this.lock = new ReentrantReadWriteLock(); this.sidekickList = new LinkedHashMap(); for (MapleSidekick sidekick : MapleSidekick.loadAll()) { if (sidekick.getId() >= 0) { this.sidekickList.put(sidekick.getId(), sidekick); } } } public void addLoadedSidekick(MapleSidekick sidekick) { if (sidekick.getId() >= 0) { this.sidekickList.put(sidekick.getId(), sidekick); } } public int createSidekick(int leaderId, int leaderId2) { return MapleSidekick.create(leaderId, leaderId2); } public void eraseSidekick(int id) { this.lock.writeLock().lock(); try { MapleSidekick ms = (MapleSidekick) this.sidekickList.remove(Integer.valueOf(id)); if (ms != null) { erasePlayer(ms.getCharacter(0).getId()); erasePlayer(ms.getCharacter(1).getId()); } } finally { this.lock.writeLock().unlock(); } } public void erasePlayer(int targetId) { int ch = WorldFindService.getInstance().findChannel(targetId); if (ch < 0) { return; } MapleCharacter player = ChannelServer.getInstance(ch).getPlayerStorage().getCharacterById(targetId); if (player != null) { player.setSidekick(null); } } public MapleSidekick getSidekick(int id) { MapleSidekick ret = null; this.lock.readLock().lock(); try { ret = (MapleSidekick) this.sidekickList.get(id); } finally { this.lock.readLock().unlock(); } if (ret == null) { this.lock.writeLock().lock(); try { ret = new MapleSidekick(id); if (ret.getId() < 0) { return null; } this.sidekickList.put(id, ret); } finally { this.lock.writeLock().unlock(); } } return ret; } public MapleSidekick getSidekickByChr(int id) { this.lock.readLock().lock(); try { for (MapleSidekick sidekick : this.sidekickList.values()) { if ((sidekick.getCharacter(0).getId() == id) || (sidekick.getCharacter(1).getId() == id)) { MapleSidekick localMapleSidekick1 = sidekick; return localMapleSidekick1; } } } finally { this.lock.readLock().unlock(); } return null; } private static class SingletonHolder { protected static final WorldSidekickService instance = new WorldSidekickService(); } }