MapleGuild.java
上传用户:gwt600
上传日期:2021-06-03
资源大小:704k
文件大小:31k
源码类别:

游戏

开发平台:

Java

  1. /*
  2. This file was written by "StellarAshes" <stellar_dust@hotmail.com> 
  3. as a part of the Guild package for
  4. the OdinMS Maple Story Server
  5. Copyright (C) 2008 Patrick Huy <patrick.huy@frz.cc> 
  6. Matthias Butz <matze@odinms.de>
  7. Jan Christian Meyer <vimes@odinms.de>
  8. This program is free software: you can redistribute it and/or modify
  9. it under the terms of the GNU Affero General Public License version 3
  10. as published by the Free Software Foundation. You may not use, modify
  11. or distribute this program under any other version of the
  12. GNU Affero General Public License.
  13. This program is distributed in the hope that it will be useful,
  14. but WITHOUT ANY WARRANTY; without even the implied warranty of
  15. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  16. GNU Affero General Public License for more details.
  17. You should have received a copy of the GNU Affero General Public License
  18. along with this program.  If not, see <http://www.gnu.org/licenses/>.
  19.  */
  20. package net.sf.odinms.net.world.guild;
  21. import java.io.FileReader;
  22. import java.io.InputStreamReader;
  23. import java.rmi.RemoteException;
  24. import java.sql.Connection;
  25. import java.sql.PreparedStatement;
  26. import java.sql.ResultSet;
  27. import java.sql.SQLException;
  28. import java.util.ArrayList;
  29. import java.util.LinkedHashMap;
  30. import java.util.List;
  31. import java.util.Map;
  32. import java.util.Properties;
  33. import java.util.Set;
  34. import net.sf.odinms.client.MapleCharacter;
  35. import net.sf.odinms.client.MapleClient;
  36. import net.sf.odinms.database.DatabaseConnection;
  37. import net.sf.odinms.net.MaplePacket;
  38. import net.sf.odinms.net.channel.ChannelServer;
  39. import net.sf.odinms.net.channel.remote.ChannelWorldInterface;
  40. import net.sf.odinms.net.world.WorldRegistryImpl;
  41. import net.sf.odinms.tools.MaplePacketCreator;
  42. import org.slf4j.Logger;
  43. import org.slf4j.LoggerFactory;
  44. public class MapleGuild implements java.io.Serializable {
  45.     private static org.slf4j.Logger log = org.slf4j.LoggerFactory.getLogger(MapleGuild.class);
  46.     // these are a few configuration variables for the guilds on your server
  47.     public final static int CREATE_GUILD_COST = 5000000; // 5 mil to start a guild
  48.     public final static int CHANGE_EMBLEM_COST = 15000000;
  49.     public final static int INCREASE_CAPACITY_COST = 5000000; // every 5 slots
  50.     public final static boolean ENABLE_BBS = true;
  51.     // end of configuration, go beyond this point at your own risk
  52.     private enum BCOp {
  53.         NONE, DISBAND, EMBELMCHANGE
  54.     }
  55.     public static final long serialVersionUID = 6322150443228168192L;
  56.     private List<MapleGuildCharacter> members;
  57.     private String rankTitles[] = new String[5]; // 1 = master, 2 = jr, 5 = lowest member
  58.     private String name;
  59.     private int id;
  60.     private int gp;
  61.     private int logo;
  62.     private int logoColor;
  63.     private int leader;
  64.     private int capacity;
  65.     private int logoBG;
  66.     private int logoBGColor;
  67.     private String notice;
  68.     private int signature;
  69.     private Map<Integer, List<Integer>> notifications = new LinkedHashMap<Integer, List<Integer>>();
  70.     private boolean bDirty = true;
  71.     private int allianceId;
  72.     // initiator is one of two things
  73.     // 1. the leader when he/she first makes the guild
  74.     // 2. the first person logging on when the server does not have
  75.     // the guild loaded
  76.     public MapleGuild(int guildid, MapleGuildCharacter initiator) // retrieves the guild from database, with guildid
  77.     {
  78.         members = new ArrayList<MapleGuildCharacter>();
  79.         Logger log = LoggerFactory.getLogger(this.getClass());
  80.         Connection con;
  81.         try {
  82.             con = DatabaseConnection.getConnection();
  83.         } catch (Exception e) {
  84.             log.error("unable to connect to database to load guild information.", e);
  85.             return;
  86.         }
  87.         try {
  88.             // first read the guild information
  89.             PreparedStatement ps = con.prepareStatement("SELECT * FROM guilds WHERE guildid=" + guildid);
  90.             ResultSet rs = ps.executeQuery();
  91.             if (!rs.first()) // no result... most likely to be someone from a disbanded guild that got rolled back
  92.             {
  93.                 // log.error("no result returned from guildid, id = " + guildid);
  94.                 id = -1;
  95.                 return;
  96.             }
  97.             id = guildid;
  98.             name = rs.getString("name");
  99.             gp = rs.getInt("GP");
  100.             logo = rs.getInt("logo");
  101.             // if (rs.wasNull())
  102.             // logo = -1;
  103.             logoColor = rs.getInt("logoColor");
  104.             logoBG = rs.getInt("logoBG");
  105.             // if (rs.wasNull())
  106.             // logo = -1;
  107.             logoBGColor = rs.getInt("logoBGColor");
  108.             capacity = rs.getInt("capacity");
  109.             for (int i = 1; i <= 5; i++) {
  110.                 rankTitles[i - 1] = rs.getString("rank" + i + "title");
  111.             }
  112.             leader = rs.getInt("leader");
  113.             notice = rs.getString("notice");
  114.             signature = rs.getInt("signature");
  115.             allianceId = rs.getInt("allianceId");
  116.             ps.close();
  117.             rs.close();
  118.             // add guild members
  119.             ps = con.prepareStatement("SELECT id, name, level, job, guildrank, allianceRank FROM characters WHERE guildid = ? ORDER BY guildrank ASC, name ASC");
  120.             ps.setInt(1, guildid);
  121.             rs = ps.executeQuery();
  122.             if (!rs.first()) // no one in guild?!
  123.             {
  124.                 log.error("No members in guild.  Impossible...");
  125.                 return;
  126.             }
  127.             do {
  128.                 members.add(new MapleGuildCharacter(rs.getInt("id"), rs.getInt("level"), rs.getString("name"), -1, // offline,
  129.                         // channel
  130.                         // shouldn't
  131.                         // matter
  132.                         rs.getInt("job"), rs.getInt("guildrank"), guildid, false, rs.getInt("allianceRank")));
  133.             } while (rs.next());
  134.             if (initiator != null) {
  135.                 setOnline(initiator.getId(), true, initiator.getChannel());
  136.             }
  137.             ps.close();
  138.             rs.close();
  139.         } catch (SQLException se) {
  140.             log.error("unable to read guild information from sql", se);
  141.             return;
  142.         }
  143.     }
  144.     public static void MapleMSlvl(MapleClient c, int npcid) {
  145.   try
  146.   {
  147.    Connection con = DatabaseConnection.getConnection();
  148.    PreparedStatement ps = con.prepareStatement(
  149.      "SELECT `name`, `level`, `str`, `dex`, " +
  150.      "`int`, `luk` FROM characters ORDER BY `level` DESC LIMIT 100");
  151.    ResultSet rs = ps.executeQuery();
  152.    c.getSession().write(MaplePacketCreator.MapleMSlvl(npcid, rs));
  153.    ps.close();
  154.    rs.close();
  155.   }
  156.   catch (Exception e) {log.error("failed to display guild ranks.", e);}
  157.  }
  158.     public static void MapleMSfame(MapleClient c, int npcid)
  159.  {
  160.   try
  161.   {
  162.    Connection con = DatabaseConnection.getConnection();
  163.    PreparedStatement ps = con.prepareStatement(
  164.      "SELECT `name`, `fame`, `str`, `dex`, " +
  165.      "`int`, `luk` FROM characters ORDER BY `fame` DESC LIMIT 100");
  166.    ResultSet rs = ps.executeQuery();
  167.    c.getSession().write(MaplePacketCreator.MapleMSfame(npcid, rs));
  168.    ps.close();
  169.    rs.close();
  170.   }
  171.   catch (Exception e) {log.error("failed to display guild ranks.", e);}
  172.  }
  173.     public static void MapleMSmeso(MapleClient c, int npcid)
  174.  {
  175.   try
  176.   {
  177.    Connection con = DatabaseConnection.getConnection();
  178.    PreparedStatement ps = con.prepareStatement(
  179.      "SELECT `name`, `meso`, `str`, `dex`, " +
  180.      "`int`, `luk` FROM characters ORDER BY `meso` DESC LIMIT 100");
  181.    ResultSet rs = ps.executeQuery();
  182.    c.getSession().write(MaplePacketCreator.MapleMSmeso(npcid, rs));
  183.    ps.close();
  184.    rs.close();
  185.   }
  186.   catch (Exception e) {log.error("failed to display guild ranks.", e);}
  187.  }
  188.     public static void MapleMSzs(MapleClient c, int npcid)
  189.  {
  190.   try
  191.   {
  192.    Connection con = DatabaseConnection.getConnection();
  193.    PreparedStatement ps = con.prepareStatement(
  194.      "SELECT `name`, `reborns`, `str`, `dex`, " +
  195.      "`int`, `luk` FROM characters ORDER BY `reborns` DESC LIMIT 10");
  196.    ResultSet rs = ps.executeQuery();
  197.    c.getSession().write(MaplePacketCreator.MapleMSzs(npcid, rs));
  198.    ps.close();
  199.    rs.close();
  200.   }
  201.   catch (Exception e) {log.error("failed to display guild ranks.", e);}
  202.  }
  203.     public static void MapleMSjk(MapleClient c, int npcid)
  204.  {
  205.   try
  206.   {
  207.    Connection con = DatabaseConnection.getConnection();
  208.    PreparedStatement ps = con.prepareStatement(
  209.      "SELECT `name`, `juankuan`, `str`, `dex`, " +
  210.      "`int`, `luk` FROM characters ORDER BY `juankuan` DESC LIMIT 10");
  211.    ResultSet rs = ps.executeQuery();
  212.    c.getSession().write(MaplePacketCreator.MapleMSjk(npcid, rs));
  213.    ps.close();
  214.    rs.close();
  215.   }
  216.   catch (Exception e) {log.error("查看慈善玩家排行出错.", e);}
  217.  }
  218.     public static void MapleMSpvpkills(MapleClient c, int npcid)
  219.  {
  220.   try
  221.   {
  222.    Connection con = DatabaseConnection.getConnection();
  223.    PreparedStatement ps = con.prepareStatement(
  224.      "SELECT `name`, `pvpkills`, `str`, `dex`, " +
  225.      "`int`, `luk` FROM characters ORDER BY `pvpkills` DESC LIMIT 10");
  226.    ResultSet rs = ps.executeQuery();
  227.    c.getSession().write(MaplePacketCreator.MapleMSpvpkills(npcid, rs));
  228.    ps.close();
  229.    rs.close();
  230.   }
  231.   catch (Exception e) {log.error("failed to display guild ranks.", e);}
  232.  }
  233.     public static void MapleMSpvpdeaths(MapleClient c, int npcid)
  234.  {
  235.   try
  236.   {
  237.    Connection con = DatabaseConnection.getConnection();
  238.    PreparedStatement ps = con.prepareStatement(
  239.      "SELECT `name`, `pvpdeaths`, `str`, `dex`, " +
  240.      "`int`, `luk` FROM characters ORDER BY `pvpdeaths` DESC LIMIT 20");
  241.    ResultSet rs = ps.executeQuery();
  242.    c.getSession().write(MaplePacketCreator.MapleMSpvpdeaths(npcid, rs));
  243.    ps.close();
  244.    rs.close();
  245.   }
  246.   catch (Exception e) {log.error("failed to display guild ranks.", e);}
  247.  }
  248.     public static void ZreHylvl(MapleClient c, int npcid) {
  249.   try
  250.   {
  251.    Connection con = DatabaseConnection.getConnection();
  252.    PreparedStatement ps = con.prepareStatement(
  253.      "SELECT `name`, `level`, `str`, `dex`, " +
  254.      "`int`, `luk` FROM characters ORDER BY `level` DESC LIMIT 100");
  255.    ResultSet rs = ps.executeQuery();
  256.    c.getSession().write(MaplePacketCreator.ZreHylvl(npcid, rs));
  257.    ps.close();
  258.    rs.close();
  259.   }
  260.   catch (Exception e) {log.error("failed to display guild ranks.", e);}
  261.  }
  262.         public static void ZreHyfame(MapleClient c, int npcid)
  263.  {
  264.   try
  265.   {
  266.    Connection con = DatabaseConnection.getConnection();
  267.    PreparedStatement ps = con.prepareStatement(
  268.      "SELECT `name`, `fame`, `str`, `dex`, " +
  269.      "`int`, `luk` FROM characters ORDER BY `fame` DESC LIMIT 100");
  270.    ResultSet rs = ps.executeQuery();
  271.    c.getSession().write(MaplePacketCreator.ZreHyfame(npcid, rs));
  272.    ps.close();
  273.    rs.close();
  274.   }
  275.   catch (Exception e) {log.error("failed to display guild ranks.", e);}
  276.  }
  277.     public static void ZreHymeso(MapleClient c, int npcid)
  278.  {
  279.   try
  280.   {
  281.    Connection con = DatabaseConnection.getConnection();
  282.    PreparedStatement ps = con.prepareStatement(
  283.      "SELECT `name`, `meso`, `str`, `dex`, " +
  284.      "`int`, `luk` FROM characters ORDER BY `meso` DESC LIMIT 100");
  285.    ResultSet rs = ps.executeQuery();
  286.    c.getSession().write(MaplePacketCreator.ZreHymeso(npcid, rs));
  287.    ps.close();
  288.    rs.close();
  289.   }
  290.   catch (Exception e) {log.error("failed to display guild ranks.", e);}
  291.  }
  292.     public static void ZreHyzs(MapleClient c, int npcid)
  293.  {
  294.   try
  295.   {
  296.    Connection con = DatabaseConnection.getConnection();
  297.    PreparedStatement ps = con.prepareStatement(
  298.      "SELECT `name`, `reborns`, `str`, `dex`, " +
  299.      "`int`, `luk` FROM characters ORDER BY `reborns` DESC LIMIT 10");
  300.    ResultSet rs = ps.executeQuery();
  301.    c.getSession().write(MaplePacketCreator.ZreHyzs(npcid, rs));
  302.    ps.close();
  303.    rs.close();
  304.   }
  305.   catch (Exception e) {log.error("failed to display guild ranks.", e);}
  306.  }
  307.     public static void ZreHypvpkills(MapleClient c, int npcid)
  308.  {
  309.   try
  310.   {
  311.    Connection con = DatabaseConnection.getConnection();
  312.    PreparedStatement ps = con.prepareStatement(
  313.      "SELECT `name`, `pvpkills`, `str`, `dex`, " +
  314.      "`int`, `luk` FROM characters ORDER BY `pvpkills` DESC LIMIT 10");
  315.    ResultSet rs = ps.executeQuery();
  316.    c.getSession().write(MaplePacketCreator.ZreHypvpkills(npcid, rs));
  317.    ps.close();
  318.    rs.close();
  319.   }
  320.   catch (Exception e) {log.error("failed to display guild ranks.", e);}
  321.  }
  322.     public static void ZreHypvpdeaths(MapleClient c, int npcid)
  323.  {
  324.   try
  325.   {
  326.    Connection con = DatabaseConnection.getConnection();
  327.    PreparedStatement ps = con.prepareStatement(
  328.      "SELECT `name`, `pvpdeaths`, `str`, `dex`, " +
  329.      "`int`, `luk` FROM characters ORDER BY `pvpdeaths` DESC LIMIT 20");
  330.    ResultSet rs = ps.executeQuery();
  331.    c.getSession().write(MaplePacketCreator.ZreHypvpdeaths(npcid, rs));
  332.    ps.close();
  333.    rs.close();
  334.   }
  335.   catch (Exception e) {log.error("failed to display guild ranks.", e);}
  336.  }
  337.     public void buildNotifications() {
  338.         // any function that calls this should be wrapped in
  339.         // synchronized(notifications) to make sure that it doesn't
  340.         // change before that function finishes with the updated notifications
  341.         if (!bDirty) {
  342.             return;
  343.         }
  344.         Set<Integer> chs = WorldRegistryImpl.getInstance().getChannelServer();
  345.         if (notifications.keySet().size() != chs.size()) {
  346.             notifications.clear();
  347.             for (Integer ch : chs) {
  348.                 notifications.put(ch, new java.util.LinkedList<Integer>());
  349.             }
  350.         } else {
  351.             for (List<Integer> l : notifications.values()) {
  352.                 l.clear();
  353.             }
  354.         }
  355.         synchronized (members) {
  356.             for (MapleGuildCharacter mgc : members) {
  357.                 if (!mgc.isOnline()) {
  358.                     continue;
  359.                 }
  360.                 List<Integer> ch = notifications.get(mgc.getChannel());
  361.                 if (ch == null) {
  362.                     log.warn("Unable to connect to channel " + mgc.getChannel());
  363.                 } else {
  364.                     ch.add(mgc.getId());
  365.                 }
  366.             }
  367.         }
  368.         bDirty = false;
  369.     }
  370.     public void writeToDB() {
  371.         writeToDB(false);
  372.     }
  373.     public void writeToDB(boolean bDisband) {
  374.         Connection con;
  375.         Logger log = LoggerFactory.getLogger(this.getClass());
  376.         try {
  377.             con = DatabaseConnection.getConnection();
  378.         } catch (Exception e) {
  379.             log.error("unable to connect to database to write guild information.", e);
  380.             return;
  381.         }
  382.         try {
  383.             if (!bDisband) {
  384.                 String sql = "UPDATE guilds SET " + "GP = ?, " + "logo = ?, " + "logoColor = ?, " + "logoBG = ?, " + "logoBGColor = ?, ";
  385.                 for (int i = 0; i < 5; i++) {
  386.                     sql += "rank" + (i + 1) + "title = ?, ";
  387.                 }
  388.                 sql += "capacity = ?, " + "notice = ? WHERE guildid = ?";
  389.                 PreparedStatement ps = con.prepareStatement(sql);
  390.                 ps.setInt(1, gp);
  391.                 ps.setInt(2, logo);
  392.                 ps.setInt(3, logoColor);
  393.                 ps.setInt(4, logoBG);
  394.                 ps.setInt(5, logoBGColor);
  395.                 for (int i = 6; i < 11; i++) {
  396.                     ps.setString(i, rankTitles[i - 6]);
  397.                 }
  398.                 ps.setInt(11, capacity);
  399.                 ps.setString(12, notice);
  400.                 ps.setInt(13, this.id);
  401.                 ps.execute();
  402.                 ps.close();
  403.             } else {
  404.                 PreparedStatement ps = con.prepareStatement("UPDATE characters SET guildid = 0, guildrank = 5 WHERE guildid = ?");
  405.                 ps.setInt(1, this.id);
  406.                 ps.execute();
  407.                 ps.close();
  408.                 ps = con.prepareStatement("DELETE FROM guilds WHERE guildid = ?");
  409.                 ps.setInt(1, this.id);
  410.                 ps.execute();
  411.                 ps.close();
  412.                 this.broadcast(MaplePacketCreator.guildDisband(this.id));
  413.             }
  414.         } catch (SQLException se) {
  415.             log.error(se.getLocalizedMessage(), se);
  416.         }
  417.     }
  418.     public int getId() {
  419.         return id;
  420.     }
  421.     public int getLeaderId() {
  422.         return leader;
  423.     }
  424.     public int getGP() {
  425.         return gp;
  426.     }
  427.     public int getLogo() {
  428.         return logo;
  429.     }
  430.     public void setLogo(int l) {
  431.         logo = l;
  432.     }
  433.     public int getLogoColor() {
  434.         return logoColor;
  435.     }
  436.     public void setLogoColor(int c) {
  437.         logoColor = c;
  438.     }
  439.     public int getLogoBG() {
  440.         return logoBG;
  441.     }
  442.     public void setLogoBG(int bg) {
  443.         logoBG = bg;
  444.     }
  445.     public int getLogoBGColor() {
  446.         return logoBGColor;
  447.     }
  448.     public void setLogoBGColor(int c) {
  449.         logoBGColor = c;
  450.     }
  451.     public String getNotice() {
  452.         if (notice == null) {
  453.             return "";
  454.         }
  455.         return notice;
  456.     }
  457.     public String getName() {
  458.         return name;
  459.     }
  460.     public java.util.Collection<MapleGuildCharacter> getMembers() {
  461.         return java.util.Collections.unmodifiableCollection(members);
  462.     }
  463.     public int getCapacity() {
  464.         return capacity;
  465.     }
  466.     public int getSignature() {
  467.         return signature;
  468.     }
  469.     public void broadcast(MaplePacket packet) {
  470.         broadcast(packet, -1, BCOp.NONE);
  471.     }
  472.     public void broadcast(MaplePacket packet, int exception) {
  473.         broadcast(packet, exception, BCOp.NONE);
  474.     }
  475.     // multi-purpose function that reaches every member of guild
  476.     // (except the character with exceptionId)
  477.     // in all channels with as little access to rmi as possible
  478.     public void broadcast(MaplePacket packet, int exceptionId, BCOp bcop) {
  479.         WorldRegistryImpl wr = WorldRegistryImpl.getInstance();
  480.         Set<Integer> chs = wr.getChannelServer();
  481.         synchronized (notifications) {
  482.             if (bDirty) {
  483.                 buildNotifications();
  484.             }
  485.             // now call the channelworldinterface
  486.             try {
  487.                 ChannelWorldInterface cwi;
  488.                 for (Integer ch : chs) {
  489.                     cwi = wr.getChannel(ch);
  490.                     if (notifications.get(ch).size() > 0) {
  491.                         if (bcop == BCOp.DISBAND) {
  492.                             cwi.setGuildAndRank(notifications.get(ch), 0, 5, exceptionId);
  493.                         } else if (bcop == BCOp.EMBELMCHANGE) {
  494.                             cwi.changeEmblem(this.id, notifications.get(ch), new MapleGuildSummary(this));
  495.                         } else {
  496.                             cwi.sendPacket(notifications.get(ch), packet, exceptionId);
  497.                         }
  498.                     }
  499.                 }
  500.             } catch (java.rmi.RemoteException re) {
  501.                 Logger log = LoggerFactory.getLogger(this.getClass());
  502.                 log.error("Failed to contact channel(s) for broadcast.", re);
  503.             }
  504.         }
  505.     }
  506.     public void guildMessage(MaplePacket serverNotice) {
  507.         for (MapleGuildCharacter mgc : members) {
  508.             for (ChannelServer cs : ChannelServer.getAllInstances()) {
  509.                 if (cs.getPlayerStorage().getCharacterById(mgc.getId()) != null) {
  510.                     MapleCharacter chr = cs.getPlayerStorage().getCharacterById(mgc.getId());
  511.                     chr.getClient().getSession().write(serverNotice);
  512.                     break;
  513.                 }
  514.             }
  515.         }
  516.     }
  517.     public void setOnline(int cid, boolean online, int channel) {
  518.         boolean bBroadcast = true;
  519.         for (MapleGuildCharacter mgc : members) {
  520.             if (mgc.getId() == cid) {
  521.                 if (mgc.isOnline() && online) {
  522.                     bBroadcast = false;
  523.                 }
  524.                 mgc.setOnline(online);
  525.                 mgc.setChannel(channel);
  526.                 break;
  527.             }
  528.         }
  529.         if (bBroadcast) {
  530.             this.broadcast(MaplePacketCreator.guildMemberOnline(id, cid, online), cid);
  531.         }
  532.         bDirty = true; // member formation has changed, update notifications
  533.     }
  534.     public void guildChat(String name, int cid, String msg) {
  535.         this.broadcast(MaplePacketCreator.multiChat(name, msg, 2), cid);
  536.     }
  537.     public String getRankTitle(int rank) {
  538.         return rankTitles[rank - 1];
  539.     }
  540.     // function to create guild, returns the guild id if successful, 0 if not
  541.     public static int createGuild(int leaderId, String name) {
  542.         Connection con;
  543.         try {
  544.             Properties dbProp = new Properties();
  545.             InputStreamReader is = new FileReader("db.properties");
  546.             dbProp.load(is);
  547.             con = DatabaseConnection.getConnection();
  548.             PreparedStatement ps = con.prepareStatement("SELECT guildid FROM guilds WHERE name = ?");
  549.             ps.setString(1, name);
  550.             ResultSet rs = ps.executeQuery();
  551.             if (rs.first()) // name taken
  552.             {
  553.                 return 0;
  554.             }
  555.             ps.close();
  556.             rs.close();
  557.             ps = con.prepareStatement("INSERT INTO guilds (`leader`, `name`, `signature`) VALUES (?, ?, ?)");
  558.             ps.setInt(1, leaderId);
  559.             ps.setString(2, name);
  560.             ps.setInt(3, (int) System.currentTimeMillis());
  561.             ps.execute();
  562.             ps.close();
  563.             ps = con.prepareStatement("SELECT guildid FROM guilds WHERE leader = ?");
  564.             ps.setInt(1, leaderId);
  565.             rs = ps.executeQuery();
  566.             rs.first();
  567.             return rs.getInt("guildid");
  568.         } catch (SQLException se) {
  569.             log.error("SQL THROW", se);
  570.             return 0;
  571.         } catch (Exception e) {
  572.             log.error("CREATE GUILD THROW", e);
  573.             return 0;
  574.         }
  575.     }
  576.     public int addGuildMember(MapleGuildCharacter mgc) {
  577.         // first of all, insert it into the members
  578.         // keeping alphabetical order of lowest ranks ;)
  579.         synchronized (members) {
  580.             if (members.size() >= capacity) {
  581.                 return 0;
  582.             }
  583.             for (int i = members.size() - 1; i >= 0; i--) {
  584.                 // we will stop going forward when
  585.                 // 1. we're done with rank 5s, or
  586.                 // 2. the name comes alphabetically before the new member
  587.                 if (members.get(i).getGuildRank() < 5 || members.get(i).getName().compareTo(mgc.getName()) < 0) {
  588.                     // then we should add it at the i+1 location
  589.                     members.add(i + 1, mgc);
  590.                     bDirty = true;
  591.                     break;
  592.                 }
  593.             }
  594.         }
  595.         this.broadcast(MaplePacketCreator.newGuildMember(mgc));
  596.         return 1;
  597.     }
  598.     public void leaveGuild(MapleGuildCharacter mgc) {
  599.         this.broadcast(MaplePacketCreator.memberLeft(mgc, false));
  600.         synchronized (members) {
  601.             members.remove(mgc);
  602.             bDirty = true;
  603.         }
  604.     }
  605.     public void expelMember(MapleGuildCharacter initiator, String name, int cid) {
  606.         Logger log = LoggerFactory.getLogger(this.getClass());
  607.         synchronized (members) {
  608.             java.util.Iterator<MapleGuildCharacter> itr = members.iterator();
  609.             MapleGuildCharacter mgc;
  610.             while (itr.hasNext()) {
  611.                 mgc = itr.next();
  612.                 if (mgc.getId() == cid && initiator.getGuildRank() < mgc.getGuildRank()) {
  613.                     this.broadcast(MaplePacketCreator.memberLeft(mgc, true));
  614.                     itr.remove();
  615.                     bDirty = true;
  616.                     // i hate global for not saying who expelled
  617.                     this.broadcast(MaplePacketCreator.serverNotice(5, initiator.getName() + " has expelled " +
  618.                             mgc.getName() + "."));
  619.                     try {
  620.                         if (mgc.isOnline()) {
  621.                             WorldRegistryImpl.getInstance().getChannel(mgc.getChannel()).setGuildAndRank(cid, 0, 5);
  622.                         } else {
  623.                             String sendTo = mgc.getName();
  624.                             String sendFrom = initiator.getName();
  625.                             String msg = "You have been expelled from the guild.";
  626.                             try {
  627.                                 initiator.getName();
  628.                                 MaplePacketCreator.sendUnkwnNote(sendTo, msg, sendFrom);
  629.                             } catch (SQLException e) {
  630.                                 log.error("SAVING NOTE", e);
  631.                             }
  632.                             WorldRegistryImpl.getInstance().getChannel(1).setOfflineGuildStatus((short) 0, (byte) 5, cid);
  633.                         }
  634.                     } catch (RemoteException re) {
  635.                         re.printStackTrace();
  636.                         return;
  637.                     }
  638.                     return;
  639.                 }
  640.             }
  641.             log.error("Unable to find member with name " + name + " and id " + cid);
  642.         }
  643.     }
  644.     public void changeRank(int cid, int newRank) {
  645.         for (MapleGuildCharacter mgc : members) {
  646.             if (cid == mgc.getId()) {
  647.                 try {
  648.                     if (mgc.isOnline()) {
  649.                         WorldRegistryImpl.getInstance().getChannel(mgc.getChannel()).setGuildAndRank(cid, this.id, newRank);
  650.                     } else {
  651.                         WorldRegistryImpl.getInstance().getChannel(1).setOfflineGuildStatus((short) this.id, (byte) newRank, cid);
  652.                     }
  653.                 } catch (RemoteException re) {
  654.                     re.printStackTrace();
  655.                     return;
  656.                 }
  657.                 mgc.setGuildRank(newRank);
  658.                 this.broadcast(MaplePacketCreator.changeRank(mgc));
  659.                 return;
  660.             }
  661.         }
  662.         // it should never get to this point unless cid was incorrect o_O
  663.         // System.out.println("INFO: unable to find the correct id for changeRank()");
  664.         log.info("INFO: unable to find the correct id for changeRank({}, {})", cid, newRank);
  665.     }
  666.     public void setGuildNotice(String notice) {
  667.         this.notice = notice;
  668.         writeToDB();
  669.         this.broadcast(MaplePacketCreator.guildNotice(this.id, notice));
  670.     }
  671.     public void memberLevelJobUpdate(MapleGuildCharacter mgc) {
  672.         for (MapleGuildCharacter member : members) {
  673.             if (mgc.equals(member)) {
  674.                 member.setJobId(mgc.getJobId());
  675.                 member.setLevel(mgc.getLevel());
  676.                 this.broadcast(MaplePacketCreator.guildMemberLevelJobUpdate(mgc));
  677.                 break;
  678.             }
  679.         }
  680.     }
  681.     public void changeRankTitle(String[] ranks) {
  682.         for (int i = 0; i < 5; i++) {
  683.             rankTitles[i] = ranks[i];
  684.         }
  685.         this.broadcast(MaplePacketCreator.rankTitleChange(this.id, ranks));
  686.         this.writeToDB();
  687.     }
  688.     public void disbandGuild() {
  689.         // disband the guild
  690.         this.writeToDB(true);
  691.         this.broadcast(null, -1, BCOp.DISBAND);
  692.     }
  693.     public void setGuildEmblem(short bg, byte bgcolor, short logo, byte logocolor) {
  694.         this.logoBG = bg;
  695.         this.logoBGColor = bgcolor;
  696.         this.logo = logo;
  697.         this.logoColor = logocolor;
  698.         this.writeToDB();
  699.         this.broadcast(null, -1, BCOp.EMBELMCHANGE);
  700.     }
  701.     public MapleGuildCharacter getMGC(int cid) {
  702.         for (MapleGuildCharacter mgc : members) {
  703.             if (mgc.getId() == cid) {
  704.                 return mgc;
  705.             }
  706.         }
  707.         return null;
  708.     }
  709.     public boolean increaseCapacity() {
  710.         if (capacity >= 100) {
  711.             return false;
  712.         }
  713.         capacity += 5;
  714.         this.writeToDB();
  715.         this.broadcast(MaplePacketCreator.guildCapacityChange(this.id, this.capacity));
  716.         return true;
  717.     }
  718.     public void gainGP(int amount) {
  719.         this.gp += amount;
  720.         this.writeToDB();
  721.         //this.broadcast(MaplePacketCreator.updateGP(this.id, this.gp));
  722.         this.guildMessage(MaplePacketCreator.updateGP(this.id, this.gp));
  723.     }
  724.     // null indicates successful invitation being sent
  725.     // keep in mind that this will be called by a handler most of the time
  726.     // so this will be running mostly on a channel server, unlike the rest
  727.     // of the class
  728.     public static MapleGuildResponse sendInvite(MapleClient c, String targetName) {
  729.         MapleCharacter mc = c.getChannelServer().getPlayerStorage().getCharacterByName(targetName);
  730.         if (mc == null) {
  731.             return MapleGuildResponse.NOT_IN_CHANNEL;
  732.         }
  733.         if (mc.getGuildId() > 0) {
  734.             return MapleGuildResponse.ALREADY_IN_GUILD;
  735.         }
  736.         mc.getClient().getSession().write(MaplePacketCreator.guildInvite(c.getPlayer().getGuildId(), c.getPlayer().getName()));
  737.         return null;
  738.     }
  739.     public static void displayGuildRanks(MapleClient c, int npcid) {
  740.         try {
  741.             Connection con = DatabaseConnection.getConnection();
  742.             PreparedStatement ps = con.prepareStatement(
  743.                     "SELECT `name`, `GP`, `logoBG`, `logoBGColor`, " +
  744.                     "`logo`, `logoColor` FROM guilds ORDER BY `GP` DESC LIMIT 50");
  745.             ResultSet rs = ps.executeQuery();
  746.             c.getSession().write(MaplePacketCreator.showGuildRanks(npcid, rs));
  747.             ps.close();
  748.             rs.close();
  749.         } catch (SQLException e) {
  750.             log.error("failed to display guild ranks.", e);
  751.         }
  752.     }
  753.     
  754.     public static void displayTops(MapleClient c, int npcid) {
  755.         try {
  756.             Connection con = DatabaseConnection.getConnection();
  757.             PreparedStatement ps = con.prepareStatement("SELECT `name`, `level`, `str`, `dex`, " + "`int`, `luk` FROM characters ORDER BY `level` DESC LIMIT 100");
  758.             ResultSet rs = ps.executeQuery();
  759.             c.getSession().write(MaplePacketCreator.showPlayersTop(npcid, rs));
  760.             ps.close();
  761.             rs.close();
  762.         } catch (Exception e) {
  763.             log.error("failed to display Tops", e);
  764.         }
  765.     }
  766.     public int getAllianceId() {
  767.         return this.allianceId;
  768.     }
  769.     public void setAllianceId(int aid) {
  770.         this.allianceId = aid;
  771.         try {
  772.             Connection con = DatabaseConnection.getConnection();
  773.             PreparedStatement ps = con.prepareStatement("UPDATE guilds SET allianceId = ? WHERE guildid = ?");
  774.             ps.setInt(1, aid);
  775.             ps.setInt(2, id);
  776.             ps.executeUpdate();
  777.             ps.close();
  778.         } catch (SQLException e) {
  779.         }
  780.     }
  781. }