package handling.world; import client.MapleCharacter; import handling.cashshop.CashShopServer; import handling.channel.ChannelServer; import handling.channel.PlayerStorage; import handling.world.guild.MapleBBSThread; import handling.world.guild.MapleGuild; import handling.world.guild.MapleGuildCharacter; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; import java.util.concurrent.locks.ReentrantReadWriteLock; import tools.packet.GuildPacket; public class WorldGuildService { private final Map<Integer, MapleGuild> guildList; private final ReentrantReadWriteLock lock; public static WorldGuildService getInstance() { return SingletonHolder.instance; } private WorldGuildService() { this.lock = new ReentrantReadWriteLock(); this.guildList = new LinkedHashMap(); } public void addLoadedGuild(MapleGuild guild) { if (guild.isProper()) { this.guildList.put(guild.getId(), guild); } } public int createGuild(int leaderId, String name) { return MapleGuild.createGuild(leaderId, name); } public MapleGuild getGuild(int guildId) { MapleGuild ret = null; this.lock.readLock().lock(); try { ret = (MapleGuild) this.guildList.get(guildId); } finally { this.lock.readLock().unlock(); } if (ret == null) { this.lock.writeLock().lock(); try { ret = new MapleGuild(guildId); if ((ret.getId() <= 0) || (!ret.isProper())) { return null; } this.guildList.put(guildId, ret); } finally { this.lock.writeLock().unlock(); } } return ret; } public MapleGuild getGuildByName(String guildName) { this.lock.readLock().lock(); try { for (MapleGuild g : this.guildList.values()) { if (g.getName().equalsIgnoreCase(guildName)) { MapleGuild localMapleGuild1 = g; return localMapleGuild1; } } return null; } finally { lock.readLock().unlock(); } } public MapleGuild getGuild(MapleCharacter chr) { return getGuild(chr.getGuildId()); } public void setGuildMemberOnline(MapleGuildCharacter guildMember, boolean isOnline, int channel) { MapleGuild guild = getGuild(guildMember.getGuildId()); if (guild != null) { guild.setOnline(guildMember.getId(), isOnline, channel); } } public void guildPacket(int guildId, byte[] message) { MapleGuild guild = getGuild(guildId); if (guild != null) { guild.broadcast(message); } } public int addGuildMember(MapleGuildCharacter guildMember) { MapleGuild guild = getGuild(guildMember.getGuildId()); if (guild != null) { return guild.addGuildMember(guildMember); } return 0; } public int addGuildJoinMember(MapleGuildCharacter mc) { MapleGuild guild = getGuild(mc.getGuildId()); if (guild != null) { return guild.addGuildJoinMember(mc); } return 0; } public int removeGuildJoinMember(MapleGuildCharacter mc) { MapleGuild guild = getGuild(mc.getGuildId()); if (guild != null) { return guild.removeGuildJoinMember(mc.getId()); } return 0; } public void leaveGuild(MapleGuildCharacter guildMember) { MapleGuild guild = getGuild(guildMember.getGuildId()); if (guild != null) { guild.leaveGuild(guildMember); } } public void guildChat(int guildId, String name, int chrId, String msg) { MapleGuild guild = getGuild(guildId); if (guild != null) { guild.guildChat(name, chrId, msg); } } public void changeRank(int guildId, int chrId, int newRank) { MapleGuild guild = getGuild(guildId); if (guild != null) { guild.changeRank(chrId, newRank); } } public void expelMember(MapleGuildCharacter initiator, String name, int chrId) { MapleGuild guild = getGuild(initiator.getGuildId()); if (guild != null) { guild.expelMember(initiator, name, chrId); } } public void setGuildNotice(int guildId, String notice) { MapleGuild guild = getGuild(guildId); if (guild != null) { guild.setGuildNotice(notice); } } public void setGuildLeader(int guildId, int chrId) { MapleGuild guild = getGuild(guildId); if (guild != null) { guild.changeGuildLeader(chrId); } } public void memberLevelJobUpdate(MapleGuildCharacter guildMember) { MapleGuild guild = getGuild(guildMember.getGuildId()); if (guild != null) { guild.memberLevelJobUpdate(guildMember); } } public void changeRankTitle(int guildId, String[] ranks) { MapleGuild guild = getGuild(guildId); if (guild != null) { guild.changeRankTitle(ranks); } } public void setGuildEmblem(int guildId, short bg, byte bgcolor, short logo, byte logocolor) { MapleGuild guild = getGuild(guildId); if (guild != null) { guild.setGuildEmblem(bg, bgcolor, logo, logocolor); } } public void disbandGuild(int guildId) { MapleGuild guild = getGuild(guildId); lock.writeLock().lock(); try { if (guild != null) { guild.disbandGuild(); guildList.remove(guildId); } } finally { lock.writeLock().unlock(); } } public void deleteGuildCharacter(int guildId, int charId) { MapleGuild guild = getGuild(guildId); if (guild != null) { MapleGuildCharacter mc = guild.getMGC(charId); if (mc != null) { if (mc.getGuildRank() > 1) { guild.leaveGuild(mc); } else { guild.disbandGuild(); } } } } public boolean increaseGuildCapacity(int guildId, boolean b) { MapleGuild guild = getGuild(guildId); if (guild != null) { return guild.increaseCapacity(b); } return false; } public void gainGP(int guildId, int amount) { MapleGuild guild = getGuild(guildId); if (guild != null) { guild.gainGP(amount); } } public void gainGP(int guildId, int amount, int chrId) { MapleGuild guild = getGuild(guildId); if (guild != null) { guild.gainGP(amount, false, chrId); } } public int getGP(int guildId) { MapleGuild guild = getGuild(guildId); if (guild != null) { return guild.getGP(); } return 0; } public int getInvitedId(int guildId) { MapleGuild guild = getGuild(guildId); if (guild != null) { return guild.getInvitedId(); } return 0; } public void setInvitedId(int guildId, int inviteId) { MapleGuild guild = getGuild(guildId); if (guild != null) { guild.setInvitedId(inviteId); } } public int getGuildLeader(int guildName) { MapleGuild guild = getGuild(guildName); if (guild != null) { return guild.getLeaderId(); } return 0; } public int getGuildLeader(String guildName) { MapleGuild guild = getGuildByName(guildName); if (guild != null) { return guild.getLeaderId(); } return 0; } public void save() { this.lock.writeLock().lock(); try { for (MapleGuild guild : this.guildList.values()) { guild.writeToDB(false); } } finally { this.lock.writeLock().unlock(); } } public List<MapleBBSThread> getBBS(int guildId) { MapleGuild guild = getGuild(guildId); if (guild != null) { return guild.getBBS(); } return null; } public int addBBSThread(int guildId, String title, String text, int icon, boolean bNotice, int posterId) { MapleGuild guild = getGuild(guildId); if (guild != null) { return guild.addBBSThread(title, text, icon, bNotice, posterId); } return -1; } public void editBBSThread(int guildId, int localthreadId, String title, String text, int icon, int posterId, int guildRank) { MapleGuild guild = getGuild(guildId); if (guild != null) { guild.editBBSThread(localthreadId, title, text, icon, posterId, guildRank); } } public void deleteBBSThread(int guildId, int localthreadId, int posterId, int guildRank) { MapleGuild guild = getGuild(guildId); if (guild != null) { guild.deleteBBSThread(localthreadId, posterId, guildRank); } } public void addBBSReply(int guildId, int localthreadId, String text, int posterId) { MapleGuild guild = getGuild(guildId); if (guild != null) { guild.addBBSReply(localthreadId, text, posterId); } } public void deleteBBSReply(int guildId, int localthreadId, int replyId, int posterId, int guildRank) { MapleGuild guild = getGuild(guildId); if (guild != null) { guild.deleteBBSReply(localthreadId, replyId, posterId, guildRank); } } public void changeEmblem(int gid, int affectedPlayers, MapleGuild mgs) { WorldBroadcastService.getInstance().sendGuildPacket(affectedPlayers, GuildPacket.guildEmblemChange(gid, (short) mgs.getLogoBG(), (byte) mgs.getLogoBGColor(), (short) mgs.getLogo(), (byte) mgs.getLogoColor()), -1, gid); setGuildAndRank(affectedPlayers, -1, -1, -1, -1); } public void setGuildAndRank(int chrId, int guildId, int rank, int contribution, int alliancerank) { int ch = WorldFindService.getInstance().findChannel(chrId); if (ch == -1) { return; } MapleCharacter player = getStorage(ch).getCharacterById(chrId); if (player == null) { return; } boolean isDifferentGuild; if ((guildId == -1) && (rank == -1)) { isDifferentGuild = true; } else { isDifferentGuild = guildId != player.getGuildId(); player.setGuildId(guildId); player.setGuildRank((byte) rank); player.setGuildContribution(contribution); player.setAllianceRank((byte) alliancerank); player.saveGuildStatus(); } if ((isDifferentGuild) && (ch > 0)) { player.getMap().broadcastMessage(player, GuildPacket.loadGuildName(player), false); player.getMap().broadcastMessage(player, GuildPacket.loadGuildIcon(player), false); } } public PlayerStorage getStorage(int channel) { if (channel == -10) { return CashShopServer.getPlayerStorage(); } return ChannelServer.getInstance(channel).getPlayerStorage(); } private static class SingletonHolder { protected static final WorldGuildService instance = new WorldGuildService(); } }