diff --git a/src/main/java/net/server/guild/MapleGuild.java b/src/main/java/net/server/guild/MapleGuild.java index 73d7edc7e8..3c84ec956b 100644 --- a/src/main/java/net/server/guild/MapleGuild.java +++ b/src/main/java/net/server/guild/MapleGuild.java @@ -24,44 +24,35 @@ package net.server.guild; import client.MapleCharacter; import client.MapleClient; import config.YamlConfig; +import net.server.PlayerStorage; +import net.server.Server; +import net.server.audit.locks.MonitoredLockType; +import net.server.audit.locks.factory.MonitoredReentrantLockFactory; +import net.server.channel.Channel; +import net.server.coordinator.matchchecker.MapleMatchCheckerCoordinator; +import net.server.coordinator.world.MapleInviteCoordinator; +import net.server.coordinator.world.MapleInviteCoordinator.InviteType; +import net.server.coordinator.world.MapleInviteCoordinator.MapleInviteResult; +import tools.DatabaseConnection; +import tools.MaplePacketCreator; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; -import java.util.ArrayList; -import java.util.Comparator; -import java.util.LinkedHashMap; -import java.util.LinkedList; -import java.util.List; -import java.util.Map; -import java.util.HashSet; -import java.util.Set; - +import java.util.*; import java.util.concurrent.locks.Lock; -import net.server.audit.locks.factory.MonitoredReentrantLockFactory; - -import net.server.PlayerStorage; -import net.server.Server; -import net.server.channel.Channel; -import tools.DatabaseConnection; -import tools.MaplePacketCreator; -import net.server.audit.locks.MonitoredLockType; -import net.server.coordinator.world.MapleInviteCoordinator; -import net.server.coordinator.world.MapleInviteCoordinator.InviteType; -import net.server.coordinator.world.MapleInviteCoordinator.MapleInviteResult; -import net.server.coordinator.matchchecker.MapleMatchCheckerCoordinator; public class MapleGuild { - + private enum BCOp { NONE, DISBAND, EMBLEMCHANGE } - + private final List members; private final Lock membersLock = MonitoredReentrantLockFactory.createLock(MonitoredLockType.GUILD, true); - - private String rankTitles[] = new String[5]; // 1 = master, 2 = jr, 5 = lowest member + + private String[] rankTitles = new String[5]; // 1 = master, 2 = jr, 5 = lowest member private String name, notice; private int id, gp, logo, logoColor, leader, capacity, logoBG, logoBGColor, signature, allianceId; private int world; @@ -71,49 +62,46 @@ public class MapleGuild { public MapleGuild(int guildid, int world) { this.world = world; members = new ArrayList<>(); - Connection con = null; - try { - con = DatabaseConnection.getConnection(); - PreparedStatement ps = con.prepareStatement("SELECT * FROM guilds WHERE guildid = " + guildid); - ResultSet rs = ps.executeQuery(); - if (!rs.next()) { - id = -1; - ps.close(); - rs.close(); - return; + + try (Connection con = DatabaseConnection.getConnection()) { + try (PreparedStatement ps = con.prepareStatement("SELECT * FROM guilds WHERE guildid = " + guildid); + ResultSet rs = ps.executeQuery()) { + if (!rs.next()) { + id = -1; + ps.close(); + rs.close(); + return; + } + id = guildid; + name = rs.getString("name"); + gp = rs.getInt("GP"); + logo = rs.getInt("logo"); + logoColor = rs.getInt("logoColor"); + logoBG = rs.getInt("logoBG"); + logoBGColor = rs.getInt("logoBGColor"); + capacity = rs.getInt("capacity"); + for (int i = 1; i <= 5; i++) { + rankTitles[i - 1] = rs.getString("rank" + i + "title"); + } + leader = rs.getInt("leader"); + notice = rs.getString("notice"); + signature = rs.getInt("signature"); + allianceId = rs.getInt("allianceId"); } - id = guildid; - name = rs.getString("name"); - gp = rs.getInt("GP"); - logo = rs.getInt("logo"); - logoColor = rs.getInt("logoColor"); - logoBG = rs.getInt("logoBG"); - logoBGColor = rs.getInt("logoBGColor"); - capacity = rs.getInt("capacity"); - for (int i = 1; i <= 5; i++) { - rankTitles[i - 1] = rs.getString("rank" + i + "title"); + + try (PreparedStatement ps = con.prepareStatement("SELECT id, name, level, job, guildrank, allianceRank FROM characters WHERE guildid = ? ORDER BY guildrank ASC, name ASC")) { + ps.setInt(1, guildid); + + try (ResultSet rs = ps.executeQuery()) { + if (!rs.next()) { + return; + } + + do { + members.add(new MapleGuildCharacter(null, rs.getInt("id"), rs.getInt("level"), rs.getString("name"), (byte) -1, world, rs.getInt("job"), rs.getInt("guildrank"), guildid, false, rs.getInt("allianceRank"))); + } while (rs.next()); + } } - leader = rs.getInt("leader"); - notice = rs.getString("notice"); - signature = rs.getInt("signature"); - allianceId = rs.getInt("allianceId"); - ps.close(); - rs.close(); - ps = con.prepareStatement("SELECT id, name, level, job, guildrank, allianceRank FROM characters WHERE guildid = ? ORDER BY guildrank ASC, name ASC"); - ps.setInt(1, guildid); - rs = ps.executeQuery(); - if (!rs.next()) { - rs.close(); - ps.close(); - return; - } - do { - members.add(new MapleGuildCharacter(null, rs.getInt("id"), rs.getInt("level"), rs.getString("name"), (byte) -1, world, rs.getInt("job"), rs.getInt("guildrank"), guildid, false, rs.getInt("allianceRank"))); - } while (rs.next()); - - ps.close(); - rs.close(); - con.close(); } catch (SQLException se) { se.printStackTrace(); System.out.println("Unable to read guild information from sql: " + se); @@ -137,32 +125,33 @@ public class MapleGuild { } } } - + membersLock.lock(); try { for (MapleGuildCharacter mgc : members) { if (!mgc.isOnline()) { continue; } - + List chl; synchronized (notifications) { chl = notifications.get(mgc.getChannel()); } - if (chl != null) chl.add(mgc.getId()); + if (chl != null) { + chl.add(mgc.getId()); + } //Unable to connect to Channel... error was here } } finally { membersLock.unlock(); } - + bDirty = false; } public void writeToDB(boolean bDisband) { - try { - Connection con = DatabaseConnection.getConnection(); - + try (Connection con = DatabaseConnection.getConnection()) { + if (!bDisband) { StringBuilder builder = new StringBuilder(); builder.append("UPDATE guilds SET GP = ?, logo = ?, logoColor = ?, logoBG = ?, logoBGColor = ?, "); @@ -182,18 +171,19 @@ public class MapleGuild { ps.setInt(11, capacity); ps.setString(12, notice); ps.setInt(13, this.id); - ps.execute(); + ps.executeUpdate(); } } else { - PreparedStatement ps = con.prepareStatement("UPDATE characters SET guildid = 0, guildrank = 5 WHERE guildid = ?"); - ps.setInt(1, this.id); - ps.execute(); - ps.close(); - ps = con.prepareStatement("DELETE FROM guilds WHERE guildid = ?"); - ps.setInt(1, this.id); - ps.execute(); - ps.close(); - + try (PreparedStatement ps = con.prepareStatement("UPDATE characters SET guildid = 0, guildrank = 5 WHERE guildid = ?")) { + ps.setInt(1, this.id); + ps.executeUpdate(); + } + + try (PreparedStatement ps = con.prepareStatement("DELETE FROM guilds WHERE guildid = ?")) { + ps.setInt(1, this.id); + ps.executeUpdate(); + } + membersLock.lock(); try { this.broadcast(MaplePacketCreator.guildDisband(this.id)); @@ -201,8 +191,6 @@ public class MapleGuild { membersLock.unlock(); } } - - con.close(); } catch (SQLException se) { se.printStackTrace(); } @@ -215,7 +203,7 @@ public class MapleGuild { public int getLeaderId() { return leader; } - + public int setLeaderId(int charId) { return leader = charId; } @@ -286,40 +274,46 @@ public class MapleGuild { public void broadcastNameChanged() { PlayerStorage ps = Server.getInstance().getWorld(world).getPlayerStorage(); - + for (MapleGuildCharacter mgc : getMembers()) { MapleCharacter chr = ps.getCharacterById(mgc.getId()); - if (chr == null || !chr.isLoggedinWorld()) continue; + if (chr == null || !chr.isLoggedinWorld()) { + continue; + } byte[] packet = MaplePacketCreator.guildNameChanged(chr.getId(), this.getName()); chr.getMap().broadcastMessage(chr, packet); } } - + public void broadcastEmblemChanged() { PlayerStorage ps = Server.getInstance().getWorld(world).getPlayerStorage(); - + for (MapleGuildCharacter mgc : getMembers()) { MapleCharacter chr = ps.getCharacterById(mgc.getId()); - if (chr == null || !chr.isLoggedinWorld()) continue; - + if (chr == null || !chr.isLoggedinWorld()) { + continue; + } + byte[] packet = MaplePacketCreator.guildMarkChanged(chr.getId(), this); chr.getMap().broadcastMessage(chr, packet); } } - + public void broadcastInfoChanged() { PlayerStorage ps = Server.getInstance().getWorld(world).getPlayerStorage(); - + for (MapleGuildCharacter mgc : getMembers()) { MapleCharacter chr = ps.getCharacterById(mgc.getId()); - if (chr == null || !chr.isLoggedinWorld()) continue; - + if (chr == null || !chr.isLoggedinWorld()) { + continue; + } + byte[] packet = MaplePacketCreator.showGuildInfo(chr); chr.announce(packet); } } - + public void broadcast(final byte[] packet) { broadcast(packet, -1, BCOp.NONE); } @@ -372,16 +366,16 @@ public class MapleGuild { membersLock.unlock(); } } - + public void dropMessage(String message) { dropMessage(5, message); } - + public void dropMessage(int type, String message) { membersLock.lock(); try { for (MapleGuildCharacter mgc : members) { - if(mgc.getCharacter() != null) { + if (mgc.getCharacter() != null) { mgc.getCharacter().dropMessage(type, message); } } @@ -389,7 +383,7 @@ public class MapleGuild { membersLock.unlock(); } } - + public void broadcastMessage(byte[] packet) { Server.getInstance().guildMessage(id, packet); } @@ -431,41 +425,40 @@ public class MapleGuild { } public static int createGuild(int leaderId, String name) { - try { - Connection con = DatabaseConnection.getConnection(); - PreparedStatement ps = con.prepareStatement("SELECT guildid FROM guilds WHERE name = ?"); - ps.setString(1, name); - ResultSet rs = ps.executeQuery(); - if (rs.next()) { - ps.close(); - rs.close(); - return 0; + try (Connection con = DatabaseConnection.getConnection()) { + + try (PreparedStatement ps = con.prepareStatement("SELECT guildid FROM guilds WHERE name = ?")) { + ps.setString(1, name); + try (ResultSet rs = ps.executeQuery()) { + if (rs.next()) { + return 0; + } + } } - ps.close(); - rs.close(); - - ps = con.prepareStatement("INSERT INTO guilds (`leader`, `name`, `signature`) VALUES (?, ?, ?)"); - ps.setInt(1, leaderId); - ps.setString(2, name); - ps.setInt(3, (int) System.currentTimeMillis()); - ps.execute(); - ps.close(); - - ps = con.prepareStatement("SELECT guildid FROM guilds WHERE leader = ?"); - ps.setInt(1, leaderId); - rs = ps.executeQuery(); - rs.next(); - int guildId = rs.getInt("guildid"); - rs.close(); - ps.close(); - - ps = con.prepareStatement("UPDATE characters SET guildid = ? WHERE id = ?"); - ps.setInt(1, guildId); - ps.setInt(2, leaderId); - ps.executeUpdate(); - ps.close(); - - con.close(); + + try (PreparedStatement ps = con.prepareStatement("INSERT INTO guilds (`leader`, `name`, `signature`) VALUES (?, ?, ?)")) { + ps.setInt(1, leaderId); + ps.setString(2, name); + ps.setInt(3, (int) System.currentTimeMillis()); + ps.executeUpdate(); + } + + final int guildId; + try (PreparedStatement ps = con.prepareStatement("SELECT guildid FROM guilds WHERE leader = ?")) { + ps.setInt(1, leaderId); + + try (ResultSet rs = ps.executeQuery()) { + rs.next(); + guildId = rs.getInt("guildid"); + } + } + + try (PreparedStatement ps = con.prepareStatement("UPDATE characters SET guildid = ? WHERE id = ?")) { + ps.setInt(1, guildId); + ps.setInt(2, leaderId); + ps.executeUpdate(); + } + return guildId; } catch (Exception e) { e.printStackTrace(); @@ -487,7 +480,7 @@ public class MapleGuild { break; } } - + this.broadcast(MaplePacketCreator.newGuildMember(mgc)); return 1; } finally { @@ -530,7 +523,7 @@ public class MapleGuild { ps.setLong(4, System.currentTimeMillis()); ps.executeUpdate(); } - + con.close(); } catch (SQLException e) { e.printStackTrace(); @@ -564,7 +557,7 @@ public class MapleGuild { membersLock.unlock(); } } - + public void changeRank(MapleGuildCharacter mgc, int newRank) { try { if (mgc.isOnline()) { @@ -578,7 +571,7 @@ public class MapleGuild { re.printStackTrace(); return; } - + membersLock.lock(); try { this.broadcast(MaplePacketCreator.changeRank(mgc)); @@ -586,11 +579,11 @@ public class MapleGuild { membersLock.unlock(); } } - + public void setGuildNotice(String notice) { this.notice = notice; this.writeToDB(false); - + membersLock.lock(); try { this.broadcast(MaplePacketCreator.guildNotice(this.id, notice)); @@ -634,24 +627,24 @@ public class MapleGuild { public void changeRankTitle(String[] ranks) { System.arraycopy(ranks, 0, rankTitles, 0, 5); - + membersLock.lock(); try { this.broadcast(MaplePacketCreator.rankTitleChange(this.id, ranks)); } finally { membersLock.unlock(); } - + this.writeToDB(false); } public void disbandGuild() { - if(allianceId > 0) { + if (allianceId > 0) { if (!MapleAlliance.removeGuildFromAlliance(allianceId, id, world)) { MapleAlliance.disbandAlliance(allianceId); } } - + membersLock.lock(); try { this.writeToDB(true); @@ -667,7 +660,7 @@ public class MapleGuild { this.logo = logo; this.logoColor = logocolor; this.writeToDB(false); - + membersLock.lock(); try { this.broadcast(null, -1, BCOp.EMBLEMCHANGE); @@ -696,14 +689,14 @@ public class MapleGuild { } capacity += 5; this.writeToDB(false); - + membersLock.lock(); try { this.broadcast(MaplePacketCreator.guildCapacityChange(this.id, this.capacity)); } finally { membersLock.unlock(); } - + return true; } @@ -713,8 +706,8 @@ public class MapleGuild { this.guildMessage(MaplePacketCreator.updateGP(this.id, this.gp)); this.guildMessage(MaplePacketCreator.getGPMessage(amount)); } - - public void removeGP(int amount){ + + public void removeGP(int amount) { this.gp -= amount; this.writeToDB(false); this.guildMessage(MaplePacketCreator.updateGP(this.id, this.gp)); @@ -728,7 +721,7 @@ public class MapleGuild { if (mc.getGuildId() > 0) { return MapleGuildResponse.ALREADY_IN_GUILD; } - + MapleCharacter sender = c.getPlayer(); if (MapleInviteCoordinator.createInvite(InviteType.GUILD, sender, sender.getGuildId(), mc.getId())) { mc.getClient().announce(MaplePacketCreator.guildInvite(sender.getGuildId(), sender.getName())); @@ -737,55 +730,49 @@ public class MapleGuild { return MapleGuildResponse.MANAGING_INVITE; } } - + public static boolean answerInvitation(int targetId, String targetName, int guildId, boolean answer) { MapleInviteResult res = MapleInviteCoordinator.answerInvite(InviteType.GUILD, targetId, guildId, answer); - + MapleGuildResponse mgr; MapleCharacter sender = res.from; switch (res.result) { case ACCEPTED: return true; - + case DENIED: mgr = MapleGuildResponse.DENIED_INVITE; break; - + default: mgr = MapleGuildResponse.NOT_FOUND_INVITE; } - + if (mgr != null && sender != null) { sender.announce(mgr.getPacket(targetName)); } return false; } - + public static Set getEligiblePlayersForGuild(MapleCharacter guildLeader) { Set guildMembers = new HashSet<>(); guildMembers.add(guildLeader); - + MapleMatchCheckerCoordinator mmce = guildLeader.getWorldServer().getMatchCheckerCoordinator(); for (MapleCharacter chr : guildLeader.getMap().getAllPlayers()) { if (chr.getParty() == null && chr.getGuild() == null && mmce.getMatchConfirmationLeaderid(chr.getId()) == -1) { guildMembers.add(chr); } } - + return guildMembers; } - + public static void displayGuildRanks(MapleClient c, int npcid) { - try { - ResultSet rs; - Connection con = DatabaseConnection.getConnection(); - try (PreparedStatement ps = con.prepareStatement("SELECT `name`, `GP`, `logoBG`, `logoBGColor`, `logo`, `logoColor` FROM guilds ORDER BY `GP` DESC LIMIT 50", - ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY)) { - rs = ps.executeQuery(); - c.announce(MaplePacketCreator.showGuildRanks(npcid, rs)); - } - rs.close(); - con.close(); + try (Connection con = DatabaseConnection.getConnection(); + PreparedStatement ps = con.prepareStatement("SELECT `name`, `GP`, `logoBG`, `logoBGColor`, `logo`, `logoColor` FROM guilds ORDER BY `GP` DESC LIMIT 50", ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY); + ResultSet rs = ps.executeQuery()) { + c.announce(MaplePacketCreator.showGuildRanks(npcid, rs)); } catch (SQLException e) { e.printStackTrace(); System.out.println("failed to display guild ranks. " + e); @@ -798,41 +785,35 @@ public class MapleGuild { public void setAllianceId(int aid) { this.allianceId = aid; - try { - Connection con = DatabaseConnection.getConnection(); - try (PreparedStatement ps = con.prepareStatement("UPDATE guilds SET allianceId = ? WHERE guildid = ?")) { - ps.setInt(1, aid); - ps.setInt(2, id); - ps.executeUpdate(); - } - - con.close(); + try (Connection con = DatabaseConnection.getConnection(); + PreparedStatement ps = con.prepareStatement("UPDATE guilds SET allianceId = ? WHERE guildid = ?")) { + ps.setInt(1, aid); + ps.setInt(2, id); + ps.executeUpdate(); } catch (SQLException e) { e.printStackTrace(); } } - + public void resetAllianceGuildPlayersRank() { try { membersLock.lock(); try { - for(MapleGuildCharacter mgc: members) { - if(mgc.isOnline()) { + for (MapleGuildCharacter mgc : members) { + if (mgc.isOnline()) { mgc.setAllianceRank(5); } } } finally { membersLock.unlock(); } - - Connection con = DatabaseConnection.getConnection(); - try (PreparedStatement ps = con.prepareStatement("UPDATE characters SET allianceRank = ? WHERE guildid = ?")) { + + try (Connection con = DatabaseConnection.getConnection(); + PreparedStatement ps = con.prepareStatement("UPDATE characters SET allianceRank = ? WHERE guildid = ?")) { ps.setInt(1, 5); ps.setInt(2, id); ps.executeUpdate(); } - - con.close(); } catch (SQLException e) { e.printStackTrace(); } @@ -840,7 +821,7 @@ public class MapleGuild { public static int getIncreaseGuildCost(int size) { int cost = YamlConfig.config.server.EXPAND_GUILD_BASE_COST + Math.max(0, (size - 15) / 5) * YamlConfig.config.server.EXPAND_GUILD_TIER_COST; - + if (size > 30) { return Math.min(YamlConfig.config.server.EXPAND_GUILD_MAX_COST, Math.max(cost, 5000000)); } else {