Advertisement
brounlimited

CharSelectInfo.java

Nov 30th, 2014
222
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 12.20 KB | None | 0 0
  1. /*
  2.  * This program is free software: you can redistribute it and/or modify it under
  3.  * the terms of the GNU General Public License as published by the Free Software
  4.  * Foundation, either version 3 of the License, or (at your option) any later
  5.  * version.
  6.  *
  7.  * This program is distributed in the hope that it will be useful, but WITHOUT
  8.  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
  9.  * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
  10.  * details.
  11.  *
  12.  * You should have received a copy of the GNU General Public License along with
  13.  * this program. If not, see <http://www.gnu.org/licenses/>.
  14.  */
  15. package net.sf.l2j.gameserver.network.serverpackets;
  16.  
  17. import java.sql.Connection;
  18. import java.sql.PreparedStatement;
  19. import java.sql.ResultSet;
  20. import java.util.ArrayList;
  21. import java.util.List;
  22. import java.util.logging.Level;
  23.  
  24. import net.sf.l2j.L2DatabaseFactory;
  25. import net.sf.l2j.gameserver.datatables.ClanTable;
  26. import net.sf.l2j.gameserver.model.CharSelectInfoPackage;
  27. import net.sf.l2j.gameserver.model.L2Clan;
  28. import net.sf.l2j.gameserver.model.itemcontainer.Inventory;
  29. import net.sf.l2j.gameserver.network.L2GameClient;
  30.  
  31. public class CharSelectInfo extends L2GameServerPacket
  32. {
  33.     private final String _loginName;
  34.     private final int _sessionId;
  35.     private int _activeId;
  36.     private final CharSelectInfoPackage[] _characterPackages;
  37.    
  38.     public CharSelectInfo(String loginName, int sessionId)
  39.     {
  40.         _sessionId = sessionId;
  41.         _loginName = loginName;
  42.         _characterPackages = loadCharacterSelectInfo(_loginName);
  43.         _activeId = -1;
  44.     }
  45.    
  46.     public CharSelectInfo(String loginName, int sessionId, int activeId)
  47.     {
  48.         _sessionId = sessionId;
  49.         _loginName = loginName;
  50.         _characterPackages = loadCharacterSelectInfo(_loginName);
  51.         _activeId = activeId;
  52.     }
  53.    
  54.     public CharSelectInfoPackage[] getCharInfo()
  55.     {
  56.         return _characterPackages;
  57.     }
  58.    
  59.     @Override
  60.     protected final void writeImpl()
  61.     {
  62.         int size = (_characterPackages.length);
  63.        
  64.         writeC(0x13);
  65.         writeD(size);
  66.        
  67.         long lastAccess = 0L;
  68.        
  69.         if (_activeId == -1)
  70.         {
  71.             for (int i = 0; i < size; i++)
  72.                 if (lastAccess < _characterPackages[i].getLastAccess())
  73.                 {
  74.                     lastAccess = _characterPackages[i].getLastAccess();
  75.                     _activeId = i;
  76.                 }
  77.         }
  78.        
  79.         for (int i = 0; i < size; i++)
  80.         {
  81.             CharSelectInfoPackage charInfoPackage = _characterPackages[i];
  82.            
  83.             writeS(charInfoPackage.getName());
  84.             writeD(charInfoPackage.getCharId());
  85.             writeS(_loginName);
  86.             writeD(_sessionId);
  87.             writeD(charInfoPackage.getClanId());
  88.             writeD(0x00); // ??
  89.            
  90.             writeD(charInfoPackage.getSex());
  91.             writeD(charInfoPackage.getRace());
  92.            
  93.             if (charInfoPackage.getClassId() == charInfoPackage.getBaseClassId())
  94.                 writeD(charInfoPackage.getClassId());
  95.             else
  96.                 writeD(charInfoPackage.getBaseClassId());
  97.            
  98.             writeD(0x01); // active ??
  99.            
  100.             writeD(charInfoPackage.getX());
  101.             writeD(charInfoPackage.getY());
  102.             writeD(charInfoPackage.getZ());
  103.            
  104.             writeF(charInfoPackage.getCurrentHp());
  105.             writeF(charInfoPackage.getCurrentMp());
  106.            
  107.             writeD(charInfoPackage.getSp());
  108.             writeQ(charInfoPackage.getExp());
  109.             writeD(charInfoPackage.getLevel());
  110.            
  111.             writeD(charInfoPackage.getKarma());
  112.             writeD(charInfoPackage.getPkKills());
  113.            
  114.             writeD(charInfoPackage.getPvPKills());
  115.             writeD(0x00);
  116.             writeD(0x00);
  117.             writeD(0x00);
  118.             writeD(0x00);
  119.             writeD(0x00);
  120.             writeD(0x00);
  121.             writeD(0x00);
  122.            
  123.             writeD(charInfoPackage.getPaperdollObjectId(Inventory.PAPERDOLL_HAIRALL));
  124.             writeD(charInfoPackage.getPaperdollObjectId(Inventory.PAPERDOLL_REAR));
  125.             writeD(charInfoPackage.getPaperdollObjectId(Inventory.PAPERDOLL_LEAR));
  126.             writeD(charInfoPackage.getPaperdollObjectId(Inventory.PAPERDOLL_NECK));
  127.             writeD(charInfoPackage.getPaperdollObjectId(Inventory.PAPERDOLL_RFINGER));
  128.             writeD(charInfoPackage.getPaperdollObjectId(Inventory.PAPERDOLL_LFINGER));
  129.             writeD(charInfoPackage.getPaperdollObjectId(Inventory.PAPERDOLL_HEAD));
  130.             writeD(charInfoPackage.getPaperdollObjectId(Inventory.PAPERDOLL_RHAND));
  131.             writeD(charInfoPackage.getPaperdollObjectId(Inventory.PAPERDOLL_LHAND));
  132.             writeD(charInfoPackage.getPaperdollObjectId(Inventory.PAPERDOLL_GLOVES));
  133.             writeD(charInfoPackage.getPaperdollObjectId(Inventory.PAPERDOLL_CHEST));
  134.             writeD(charInfoPackage.getPaperdollObjectId(Inventory.PAPERDOLL_LEGS));
  135.             writeD(charInfoPackage.getPaperdollObjectId(Inventory.PAPERDOLL_FEET));
  136.             writeD(charInfoPackage.getPaperdollObjectId(Inventory.PAPERDOLL_BACK));
  137.             writeD(charInfoPackage.getPaperdollObjectId(Inventory.PAPERDOLL_RHAND));
  138.             writeD(charInfoPackage.getPaperdollObjectId(Inventory.PAPERDOLL_HAIR));
  139.             writeD(charInfoPackage.getPaperdollObjectId(Inventory.PAPERDOLL_FACE));
  140.            
  141.             writeD(charInfoPackage.getPaperdollItemId(Inventory.PAPERDOLL_HAIRALL));
  142.             writeD(charInfoPackage.getPaperdollItemId(Inventory.PAPERDOLL_REAR));
  143.             writeD(charInfoPackage.getPaperdollItemId(Inventory.PAPERDOLL_LEAR));
  144.             writeD(charInfoPackage.getPaperdollItemId(Inventory.PAPERDOLL_NECK));
  145.             writeD(charInfoPackage.getPaperdollItemId(Inventory.PAPERDOLL_RFINGER));
  146.             writeD(charInfoPackage.getPaperdollItemId(Inventory.PAPERDOLL_LFINGER));
  147.             writeD(charInfoPackage.getPaperdollItemId(Inventory.PAPERDOLL_HEAD));
  148.             writeD(charInfoPackage.getPaperdollItemId(Inventory.PAPERDOLL_RHAND));
  149.             writeD(charInfoPackage.getPaperdollItemId(Inventory.PAPERDOLL_LHAND));
  150.             writeD(charInfoPackage.getPaperdollItemId(Inventory.PAPERDOLL_GLOVES));
  151.             writeD(charInfoPackage.getPaperdollItemId(Inventory.PAPERDOLL_CHEST));
  152.             writeD(charInfoPackage.getPaperdollItemId(Inventory.PAPERDOLL_LEGS));
  153.             writeD(charInfoPackage.getPaperdollItemId(Inventory.PAPERDOLL_FEET));
  154.             writeD(charInfoPackage.getPaperdollItemId(Inventory.PAPERDOLL_BACK));
  155.             writeD(charInfoPackage.getPaperdollItemId(Inventory.PAPERDOLL_RHAND));
  156.             writeD(charInfoPackage.getPaperdollItemId(Inventory.PAPERDOLL_HAIR));
  157.             writeD(charInfoPackage.getPaperdollItemId(Inventory.PAPERDOLL_FACE));
  158.            
  159.             writeD(charInfoPackage.getHairStyle());
  160.             writeD(charInfoPackage.getHairColor());
  161.             writeD(charInfoPackage.getFace());
  162.            
  163.             writeF(charInfoPackage.getMaxHp());
  164.             writeF(charInfoPackage.getMaxMp());
  165.            
  166.             writeD((charInfoPackage.getAccessLevel() > -100) ? ((charInfoPackage.getDeleteTimer() > 0) ? (int) ((charInfoPackage.getDeleteTimer() - System.currentTimeMillis()) / 1000) : 0) : -1);
  167.  
  168.             writeD(charInfoPackage.getClassId());
  169.             writeD((i == _activeId) ? 0x01 : 0x00);
  170.             writeC((charInfoPackage.getEnchantEffect() > 127) ? 127 : charInfoPackage.getEnchantEffect());
  171.            
  172.             writeD(charInfoPackage.getAugmentationId());
  173.         }
  174.     }
  175.    
  176.     private static CharSelectInfoPackage[] loadCharacterSelectInfo(String loginName)
  177.     {
  178.         CharSelectInfoPackage charInfopackage;
  179.         List<CharSelectInfoPackage> characterList = new ArrayList<>();
  180.        
  181.         try (Connection con = L2DatabaseFactory.getInstance().getConnection())
  182.         {
  183.             PreparedStatement statement = con.prepareStatement("SELECT account_name, obj_Id, char_name, level, maxHp, curHp, maxMp, curMp, face, hairStyle, hairColor, sex, heading, x, y, z, exp, sp, karma, pvpkills, pkkills, clanid, race, classid, deletetime, cancraft, title, accesslevel, online, char_slot, lastAccess, base_class FROM characters WHERE account_name=?");
  184.             statement.setString(1, loginName);
  185.             ResultSet charList = statement.executeQuery();
  186.            
  187.             while (charList.next())// fills the package
  188.             {
  189.                 charInfopackage = restoreChar(charList);
  190.                 if (charInfopackage != null)
  191.                     characterList.add(charInfopackage);
  192.             }
  193.            
  194.             charList.close();
  195.             statement.close();
  196.            
  197.             return characterList.toArray(new CharSelectInfoPackage[characterList.size()]);
  198.         }
  199.         catch (Exception e)
  200.         {
  201.             _log.log(Level.WARNING, "Could not restore char info: " + e.getMessage(), e);
  202.         }
  203.        
  204.         return new CharSelectInfoPackage[0];
  205.     }
  206.    
  207.     private static void loadCharacterSubclassInfo(CharSelectInfoPackage charInfopackage, int ObjectId, int activeClassId)
  208.     {
  209.         try (Connection con = L2DatabaseFactory.getInstance().getConnection())
  210.         {
  211.             PreparedStatement statement = con.prepareStatement("SELECT exp, sp, level FROM character_subclasses WHERE char_obj_id=? && class_id=? ORDER BY char_obj_id");
  212.             statement.setInt(1, ObjectId);
  213.             statement.setInt(2, activeClassId);
  214.             ResultSet charList = statement.executeQuery();
  215.            
  216.             if (charList.next())
  217.             {
  218.                 charInfopackage.setExp(charList.getLong("exp"));
  219.                 charInfopackage.setSp(charList.getInt("sp"));
  220.                 charInfopackage.setLevel(charList.getInt("level"));
  221.             }
  222.            
  223.             charList.close();
  224.             statement.close();
  225.            
  226.         }
  227.         catch (Exception e)
  228.         {
  229.             _log.log(Level.WARNING, "Could not restore char subclass info: " + e.getMessage(), e);
  230.         }
  231.     }
  232.    
  233.     private static CharSelectInfoPackage restoreChar(ResultSet chardata) throws Exception
  234.     {
  235.         int objectId = chardata.getInt("obj_id");
  236.         String name = chardata.getString("char_name");
  237.        
  238.         // See if the char must be deleted
  239.         long deletetime = chardata.getLong("deletetime");
  240.         if (deletetime > 0)
  241.         {
  242.             if (System.currentTimeMillis() > deletetime)
  243.             {
  244.                 L2Clan clan = ClanTable.getInstance().getClan(chardata.getInt("clanid"));
  245.                 if (clan != null)
  246.                     clan.removeClanMember(objectId, 0);
  247.                
  248.                 L2GameClient.deleteCharByObjId(objectId);
  249.                 return null;
  250.             }
  251.         }
  252.        
  253.         CharSelectInfoPackage charInfopackage = new CharSelectInfoPackage(objectId, name);
  254.         charInfopackage.setAccessLevel(chardata.getInt("accesslevel"));
  255.         charInfopackage.setLevel(chardata.getInt("level"));
  256.         charInfopackage.setMaxHp(chardata.getInt("maxhp"));
  257.         charInfopackage.setCurrentHp(chardata.getDouble("curhp"));
  258.         charInfopackage.setMaxMp(chardata.getInt("maxmp"));
  259.         charInfopackage.setCurrentMp(chardata.getDouble("curmp"));
  260.         charInfopackage.setKarma(chardata.getInt("karma"));
  261.         charInfopackage.setPkKills(chardata.getInt("pkkills"));
  262.         charInfopackage.setPvPKills(chardata.getInt("pvpkills"));
  263.         charInfopackage.setFace(chardata.getInt("face"));
  264.         charInfopackage.setHairStyle(chardata.getInt("hairstyle"));
  265.         charInfopackage.setHairColor(chardata.getInt("haircolor"));
  266.         charInfopackage.setSex(chardata.getInt("sex"));
  267.        
  268.         charInfopackage.setExp(chardata.getLong("exp"));
  269.         charInfopackage.setSp(chardata.getInt("sp"));
  270.         charInfopackage.setClanId(chardata.getInt("clanid"));
  271.        
  272.         charInfopackage.setRace(chardata.getInt("race"));
  273.        
  274.         final int baseClassId = chardata.getInt("base_class");
  275.         final int activeClassId = chardata.getInt("classid");
  276.        
  277.         charInfopackage.setX(chardata.getInt("x"));
  278.         charInfopackage.setY(chardata.getInt("y"));
  279.         charInfopackage.setZ(chardata.getInt("z"));
  280.        
  281.         // if is in subclass, load subclass exp, sp, lvl info
  282.         if (baseClassId != activeClassId)
  283.             loadCharacterSubclassInfo(charInfopackage, objectId, activeClassId);
  284.        
  285.         charInfopackage.setClassId(activeClassId);
  286.        
  287.         // Get the augmentation id for equipped weapon
  288.         int weaponObjId = charInfopackage.getPaperdollObjectId(Inventory.PAPERDOLL_RHAND);
  289.         if (weaponObjId < 1)
  290.             weaponObjId = charInfopackage.getPaperdollObjectId(Inventory.PAPERDOLL_RHAND);
  291.        
  292.         if (weaponObjId > 0)
  293.         {
  294.             try (Connection con = L2DatabaseFactory.getInstance().getConnection())
  295.             {
  296.                 PreparedStatement statement = con.prepareStatement("SELECT attributes FROM augmentations WHERE item_id=?");
  297.                 statement.setInt(1, weaponObjId);
  298.                 ResultSet result = statement.executeQuery();
  299.                
  300.                 if (result.next())
  301.                 {
  302.                     int augment = result.getInt("attributes");
  303.                     charInfopackage.setAugmentationId(augment == -1 ? 0 : augment);
  304.                 }
  305.                
  306.                 result.close();
  307.                 statement.close();
  308.             }
  309.             catch (Exception e)
  310.             {
  311.                 _log.log(Level.WARNING, "Could not restore augmentation info: " + e.getMessage(), e);
  312.             }
  313.         }
  314.        
  315.         /*
  316.          * Check if the base class is set to zero and alse doesn't match with the current active class, otherwise send the base class ID. This prevents chars created before base class was introduced from being displayed incorrectly.
  317.          */
  318.         if (baseClassId == 0 && activeClassId > 0)
  319.             charInfopackage.setBaseClassId(activeClassId);
  320.         else
  321.             charInfopackage.setBaseClassId(baseClassId);
  322.        
  323.         charInfopackage.setDeleteTimer(deletetime);
  324.         charInfopackage.setLastAccess(chardata.getLong("lastAccess"));
  325.        
  326.         return charInfopackage;
  327.     }
  328. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement