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

游戏

开发平台:

Java

  1. /*
  2. This file is part of the OdinMS Maple Story Server
  3. Copyright (C) 2008 Patrick Huy <patrick.huy@frz.cc> 
  4. Matthias Butz <matze@odinms.de>
  5. Jan Christian Meyer <vimes@odinms.de>
  6. This program is free software: you can redistribute it and/or modify
  7. it under the terms of the GNU Affero General Public License version 3
  8. as published by the Free Software Foundation. You may not use, modify
  9. or distribute this program under any other version of the
  10. GNU Affero General Public License.
  11. This program is distributed in the hope that it will be useful,
  12. but WITHOUT ANY WARRANTY; without even the implied warranty of
  13. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  14. GNU Affero General Public License for more details.
  15. You should have received a copy of the GNU Affero General Public License
  16. along with this program.  If not, see <http://www.gnu.org/licenses/>.
  17.  */
  18. package net.sf.odinms.server;
  19. import java.sql.Connection;
  20. import java.sql.PreparedStatement;
  21. import java.sql.ResultSet;
  22. import java.sql.SQLException;
  23. import java.util.ArrayList;
  24. import java.util.Collections;
  25. import java.util.Comparator;
  26. import java.util.HashMap;
  27. import java.util.LinkedList;
  28. import java.util.List;
  29. import java.util.Map;
  30. import net.sf.odinms.client.Equip;
  31. import net.sf.odinms.client.IEquip;
  32. import net.sf.odinms.client.IItem;
  33. import net.sf.odinms.client.Item;
  34. import net.sf.odinms.client.MapleClient;
  35. import net.sf.odinms.client.MapleInventoryType;
  36. import net.sf.odinms.database.DatabaseConnection;
  37. import net.sf.odinms.database.DatabaseException;
  38. import net.sf.odinms.tools.MaplePacketCreator;
  39. import org.slf4j.Logger;
  40. import org.slf4j.LoggerFactory;
  41. /**
  42.  *
  43.  * @author Matze
  44.  */
  45. public class MapleStorage {
  46.     private int id;
  47.     private List<IItem> items;
  48.     private int meso;
  49.     private byte slots;
  50.     //private Set<MapleInventoryType> updatedTypes = new HashSet<MapleInventoryType>();
  51.     private Map<MapleInventoryType, List<IItem>> typeItems = new HashMap<MapleInventoryType, List<IItem>>();
  52.     private static Logger log = LoggerFactory.getLogger(MapleStorage.class);
  53.     private MapleStorage(int id, byte slots, int meso) {
  54.         this.id = id;
  55.         this.slots = slots;
  56.         this.items = new LinkedList<IItem>();
  57.         this.meso = meso;
  58.     }
  59.     public static MapleStorage create(int id) {
  60.         try {
  61.             Connection con = DatabaseConnection.getConnection();
  62.             PreparedStatement ps = con.prepareStatement("INSERT INTO storages (accountid, slots, meso) VALUES (?, ?, ?)");
  63.             ps.setInt(1, id);
  64.             ps.setInt(2, 16);
  65.             ps.setInt(3, 0);
  66.             ps.executeUpdate();
  67.             ps.close();
  68.         } catch (SQLException ex) {
  69.             log.error("Error creating storage", ex);
  70.         }
  71.         return loadOrCreateFromDB(id);
  72.     }
  73.     public static MapleStorage loadOrCreateFromDB(int id) {
  74.         MapleStorage ret = null;
  75.         int storeId;
  76.         try {
  77.             Connection con = DatabaseConnection.getConnection();
  78.             PreparedStatement ps = con.prepareStatement("SELECT * FROM storages WHERE accountid = ?");
  79.             ps.setInt(1, id);
  80.             ResultSet rs = ps.executeQuery();
  81.             if (!rs.next()) {
  82.                 rs.close();
  83.                 ps.close();
  84.                 return create(id);
  85.             } else {
  86.                 storeId = rs.getInt("storageid");
  87.                 ret = new MapleStorage(storeId, (byte) rs.getInt("slots"), rs.getInt("meso"));
  88.                 rs.close();
  89.                 ps.close();
  90.                 String sql = "SELECT * FROM inventoryitems " + "LEFT JOIN inventoryequipment USING (inventoryitemid) " + "WHERE storageid = ?";
  91.                 ps = con.prepareStatement(sql);
  92.                 ps.setInt(1, storeId);
  93.                 rs = ps.executeQuery();
  94.                 while (rs.next()) {
  95.                     MapleInventoryType type = MapleInventoryType.getByType((byte) rs.getInt("inventorytype"));
  96.                     if (type.equals(MapleInventoryType.EQUIP) || type.equals(MapleInventoryType.EQUIPPED)) {
  97.                         int itemid = rs.getInt("itemid");
  98.                         Equip equip = new Equip(itemid, (byte) rs.getInt("position"), rs.getInt("ringid"));
  99.                         equip.setOwner(rs.getString("owner"));
  100.                         equip.setQuantity((short) rs.getInt("quantity"));
  101.                         equip.setAcc((short) rs.getInt("acc"));
  102.                         equip.setAvoid((short) rs.getInt("avoid"));
  103.                         equip.setDex((short) rs.getInt("dex"));
  104.                         equip.setHands((short) rs.getInt("hands"));
  105.                         equip.setHp((short) rs.getInt("hp"));
  106.                         equip.setInt((short) rs.getInt("int"));
  107.                         equip.setJump((short) rs.getInt("jump"));
  108.                         equip.setLuk((short) rs.getInt("luk"));
  109.                         equip.setMatk((short) rs.getInt("matk"));
  110.                         equip.setMdef((short) rs.getInt("mdef"));
  111.                         equip.setMp((short) rs.getInt("mp"));
  112.                         equip.setSpeed((short) rs.getInt("speed"));
  113.                         equip.setStr((short) rs.getInt("str"));
  114.                         equip.setWatk((short) rs.getInt("watk"));
  115.                         equip.setWdef((short) rs.getInt("wdef"));
  116.                         equip.setUpgradeSlots((byte) rs.getInt("upgradeslots"));
  117.                         equip.setLocked((byte) rs.getInt("locked"));
  118.                         equip.setLevel((byte) rs.getInt("level"));
  119.                         ret.items.add(equip);
  120.                     } else {
  121.                         Item item = new Item(rs.getInt("itemid"), (byte) rs.getInt("position"), (short) rs.getInt("quantity"), rs.getInt("petid"));
  122.                         item.setOwner(rs.getString("owner"));
  123.                         ret.items.add(item);
  124.                     }
  125.                 }
  126.                 rs.close();
  127.                 ps.close();
  128.             }
  129.         } catch (SQLException ex) {
  130.             log.error("Error loading storage", ex);
  131.         }
  132.         return ret;
  133.     }
  134.     public void saveToDB() {
  135.         try {
  136.             MapleItemInformationProvider ii = MapleItemInformationProvider.getInstance();
  137.             Connection con = DatabaseConnection.getConnection();
  138.             PreparedStatement ps = con.prepareStatement("UPDATE storages SET slots = ?, meso = ? WHERE storageid = ?");
  139.             ps.setInt(1, slots);
  140.             ps.setInt(2, meso);
  141.             ps.setInt(3, id);
  142.             ps.executeUpdate();
  143.             ps.close();
  144.             ps = con.prepareStatement("DELETE FROM inventoryitems WHERE storageid = ?");
  145.             ps.setInt(1, id);
  146.             ps.executeUpdate();
  147.             ps.close();
  148.             ps = con.prepareStatement("INSERT INTO inventoryitems (storageid, itemid, inventorytype, position, quantity, owner) VALUES (?, ?, ?, ?, ?, ?)");
  149.             PreparedStatement pse = con.prepareStatement("INSERT INTO inventoryequipment VALUES (DEFAULT, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)");
  150.             MapleInventoryType type;
  151.             for (IItem item : items) {
  152.                 ps.setInt(1, id);
  153.                 ps.setInt(2, item.getItemId());
  154.                 type = ii.getInventoryType(item.getItemId());
  155.                 ps.setInt(3, type.getType());
  156.                 ps.setInt(4, item.getPosition());
  157.                 ps.setInt(5, item.getQuantity());
  158.                 ps.setString(6, item.getOwner());
  159.                 ps.executeUpdate();
  160.                 ResultSet rs = ps.getGeneratedKeys();
  161.                 int itemid;
  162.                 if (rs.next()) {
  163.                     itemid = rs.getInt(1);
  164.                 } else {
  165.                     throw new DatabaseException("Inserting char failed.");
  166.                 }
  167.                 if (type.equals(MapleInventoryType.EQUIP)) {
  168.                     pse.setInt(1, itemid);
  169.                     IEquip equip = (IEquip) item;
  170.                     pse.setInt(2, equip.getUpgradeSlots());
  171.                     pse.setInt(3, equip.getLevel());
  172.                     pse.setInt(4, equip.getStr());
  173.                     pse.setInt(5, equip.getDex());
  174.                     pse.setInt(6, equip.getInt());
  175.                     pse.setInt(7, equip.getLuk());
  176.                     pse.setInt(8, equip.getHp());
  177.                     pse.setInt(9, equip.getMp());
  178.                     pse.setInt(10, equip.getWatk());
  179.                     pse.setInt(11, equip.getMatk());
  180.                     pse.setInt(12, equip.getWdef());
  181.                     pse.setInt(13, equip.getMdef());
  182.                     pse.setInt(14, equip.getAcc());
  183.                     pse.setInt(15, equip.getAvoid());
  184.                     pse.setInt(16, equip.getHands());
  185.                     pse.setInt(17, equip.getSpeed());
  186.                     pse.setInt(18, equip.getJump());
  187.                     pse.setInt(19, equip.getRingId());
  188.                     pse.setInt(20, equip.getLocked());
  189.                     pse.executeUpdate();
  190.                 }
  191.             }
  192.             ps.close();
  193.             pse.close();
  194.         } catch (SQLException ex) {
  195.             log.error("Error saving storage", ex);
  196.         }
  197.     }
  198.     public IItem takeOut(byte slot) {
  199.         MapleItemInformationProvider ii = MapleItemInformationProvider.getInstance();
  200.         IItem ret = items.remove(slot);
  201.         MapleInventoryType type = ii.getInventoryType(ret.getItemId());
  202.         typeItems.put(type, new ArrayList<IItem>(filterItems(type)));
  203.         return ret;
  204.     }
  205.     public void store(IItem item) {
  206.         MapleItemInformationProvider ii = MapleItemInformationProvider.getInstance();
  207.         items.add(item);
  208.         MapleInventoryType type = ii.getInventoryType(item.getItemId());
  209.         typeItems.put(type, new ArrayList<IItem>(filterItems(type)));
  210.     }
  211.     public List<IItem> getItems() {
  212.         return Collections.unmodifiableList(items);
  213.     }
  214.     private List<IItem> filterItems(MapleInventoryType type) {
  215.         List<IItem> ret = new LinkedList<IItem>();
  216.         MapleItemInformationProvider ii = MapleItemInformationProvider.getInstance();
  217.         for (IItem item : items) {
  218.             if (ii.getInventoryType(item.getItemId()) == type) {
  219.                 ret.add(item);
  220.             }
  221.         }
  222.         return ret;
  223.     }
  224.     public byte getSlot(MapleInventoryType type, byte slot) {
  225.         // MapleItemInformationProvider ii = MapleItemInformationProvider.getInstance();
  226.         byte ret = 0;
  227.         for (IItem item : items) {
  228.             if (item == typeItems.get(type).get(slot)) {
  229.                 return ret;
  230.             }
  231.             ret++;
  232.         }
  233.         return -1;
  234.     }
  235.     public void sendStorage(MapleClient c, int npcId) {
  236.         if (c.isGuest()) {
  237.             c.getPlayer().dropMessage(1, "Storage is not available to Guests");
  238.             c.getSession().write(MaplePacketCreator.enableActions());
  239.             return;
  240.         }
  241.         final MapleItemInformationProvider ii = MapleItemInformationProvider.getInstance();
  242.         // sort by inventorytype to avoid confusion
  243.         Collections.sort(items, new Comparator<IItem>() {
  244.             public int compare(IItem o1, IItem o2) {
  245.                 if (ii.getInventoryType(o1.getItemId()).getType() < ii.getInventoryType(o2.getItemId()).getType()) {
  246.                     return -1;
  247.                 } else if (ii.getInventoryType(o1.getItemId()) == ii.getInventoryType(o2.getItemId())) {
  248.                     return 0;
  249.                 } else {
  250.                     return 1;
  251.                 }
  252.             }
  253.         });
  254.         for (MapleInventoryType type : MapleInventoryType.values()) {
  255.             typeItems.put(type, new ArrayList<IItem>(items));
  256.         }
  257.         c.getSession().write(MaplePacketCreator.getStorage(npcId, slots, items, meso));
  258.     }
  259.     public void sendStored(MapleClient c, MapleInventoryType type) {
  260.         c.getSession().write(MaplePacketCreator.storeStorage(slots, type, typeItems.get(type)));
  261.     }
  262.     public void sendTakenOut(MapleClient c, MapleInventoryType type) {
  263.         c.getSession().write(MaplePacketCreator.takeOutStorage(slots, type, typeItems.get(type)));
  264.     }
  265.     public int getMeso() {
  266.         return meso;
  267.     }
  268.     public void setMeso(int meso) {
  269.         if (meso < 0) {
  270.             throw new RuntimeException();
  271.         }
  272.         this.meso = meso;
  273.     }
  274.     public void sendMeso(MapleClient c) {
  275.         c.getSession().write(MaplePacketCreator.mesoStorage(slots, meso));
  276.     }
  277.     public boolean isFull() {
  278.         return items.size() >= slots;
  279.     }
  280.     public void close() {
  281.         typeItems.clear();
  282.     }
  283. }