CharSelectionInfo.java 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387
  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.serverpackets;
  16. import java.sql.PreparedStatement;
  17. import java.sql.ResultSet;
  18. import java.util.List;
  19. import java.util.logging.Logger;
  20. import javolution.util.FastList;
  21. import net.sf.l2j.L2DatabaseFactory;
  22. import net.sf.l2j.gameserver.datatables.ClanTable;
  23. import net.sf.l2j.gameserver.instancemanager.CursedWeaponsManager;
  24. import net.sf.l2j.gameserver.model.CharSelectInfoPackage;
  25. import net.sf.l2j.gameserver.model.Inventory;
  26. import net.sf.l2j.gameserver.model.L2Clan;
  27. import net.sf.l2j.gameserver.network.L2GameClient;
  28. /**
  29. * This class ...
  30. *
  31. * @version $Revision: 1.8.2.4.2.6 $ $Date: 2005/04/06 16:13:46 $
  32. */
  33. public class CharSelectionInfo extends L2GameServerPacket
  34. {
  35. // d SdSddddddddddffddddddddddddddddddddddddddddddddddddddddddddddffd
  36. private static final String _S__1F_CHARSELECTINFO = "[S] 09 CharSelectInfo";
  37. private static Logger _log = Logger.getLogger(CharSelectionInfo.class.getName());
  38. private String _loginName;
  39. private int _sessionId, _activeId;
  40. private CharSelectInfoPackage[] _characterPackages;
  41. /**
  42. * @param _characters
  43. */
  44. public CharSelectionInfo(String loginName, int sessionId)
  45. {
  46. _sessionId = sessionId;
  47. _loginName = loginName;
  48. _characterPackages = loadCharacterSelectInfo();
  49. _activeId = -1;
  50. }
  51. public CharSelectionInfo(String loginName, int sessionId, int activeId)
  52. {
  53. _sessionId = sessionId;
  54. _loginName = loginName;
  55. _characterPackages = loadCharacterSelectInfo();
  56. _activeId = activeId;
  57. }
  58. public CharSelectInfoPackage[] getCharInfo()
  59. {
  60. return _characterPackages;
  61. }
  62. @Override
  63. protected final void writeImpl()
  64. {
  65. writeC(0x09);
  66. int size = (_characterPackages.length);
  67. writeD(size);
  68. // Can prevent players from creating new characters (if 0); (if 1, the client will ask if chars may be created (0x13) Response: (0x0D) )
  69. writeD(0x07);
  70. writeC(0x00);
  71. long lastAccess = 0L;
  72. if (_activeId == -1)
  73. {
  74. for (int i = 0; i < size; i++)
  75. {
  76. if (lastAccess < _characterPackages[i].getLastAccess())
  77. {
  78. lastAccess = _characterPackages[i].getLastAccess();
  79. _activeId = i;
  80. }
  81. }
  82. }
  83. for (int i = 0; i < size; i++)
  84. {
  85. CharSelectInfoPackage charInfoPackage = _characterPackages[i];
  86. writeS(charInfoPackage.getName());
  87. writeD(charInfoPackage.getCharId());
  88. writeS(_loginName);
  89. writeD(_sessionId);
  90. writeD(charInfoPackage.getClanId());
  91. writeD(0x00); // ??
  92. writeD(charInfoPackage.getSex());
  93. writeD(charInfoPackage.getRace());
  94. if (charInfoPackage.getClassId() == charInfoPackage.getBaseClassId())
  95. writeD(charInfoPackage.getClassId());
  96. else
  97. writeD(charInfoPackage.getBaseClassId());
  98. writeD(0x01); // active ??
  99. writeD(0x00); // x
  100. writeD(0x00); // y
  101. writeD(0x00); // z
  102. writeF(charInfoPackage.getCurrentHp()); // hp cur
  103. writeF(charInfoPackage.getCurrentMp()); // mp cur
  104. writeD(charInfoPackage.getSp());
  105. writeQ(charInfoPackage.getExp());
  106. writeD(charInfoPackage.getLevel());
  107. writeD(charInfoPackage.getKarma()); // karma
  108. writeD(charInfoPackage.getPkKills());
  109. writeD(0x00);
  110. writeD(0x00);
  111. writeD(0x00);
  112. writeD(0x00);
  113. writeD(0x00);
  114. writeD(0x00);
  115. writeD(0x00);
  116. writeD(0x00);
  117. writeD(charInfoPackage.getPaperdollItemId(Inventory.PAPERDOLL_HAIRALL));
  118. writeD(charInfoPackage.getPaperdollItemId(Inventory.PAPERDOLL_REAR));
  119. writeD(charInfoPackage.getPaperdollItemId(Inventory.PAPERDOLL_LEAR));
  120. writeD(charInfoPackage.getPaperdollItemId(Inventory.PAPERDOLL_NECK));
  121. writeD(charInfoPackage.getPaperdollItemId(Inventory.PAPERDOLL_RFINGER));
  122. writeD(charInfoPackage.getPaperdollItemId(Inventory.PAPERDOLL_LFINGER));
  123. writeD(charInfoPackage.getPaperdollItemId(Inventory.PAPERDOLL_HEAD));
  124. writeD(charInfoPackage.getPaperdollItemId(Inventory.PAPERDOLL_RHAND));
  125. writeD(charInfoPackage.getPaperdollItemId(Inventory.PAPERDOLL_LHAND));
  126. writeD(charInfoPackage.getPaperdollItemId(Inventory.PAPERDOLL_GLOVES));
  127. writeD(charInfoPackage.getPaperdollItemId(Inventory.PAPERDOLL_CHEST));
  128. writeD(charInfoPackage.getPaperdollItemId(Inventory.PAPERDOLL_LEGS));
  129. writeD(charInfoPackage.getPaperdollItemId(Inventory.PAPERDOLL_FEET));
  130. writeD(charInfoPackage.getPaperdollItemId(Inventory.PAPERDOLL_BACK));
  131. writeD(charInfoPackage.getPaperdollItemId(Inventory.PAPERDOLL_LRHAND));
  132. writeD(charInfoPackage.getPaperdollItemId(Inventory.PAPERDOLL_HAIR));
  133. writeD(charInfoPackage.getPaperdollItemId(Inventory.PAPERDOLL_HAIR2));
  134. writeD(charInfoPackage.getPaperdollItemId(Inventory.PAPERDOLL_RBRACELET));
  135. writeD(charInfoPackage.getPaperdollItemId(Inventory.PAPERDOLL_LBRACELET));
  136. writeD(0x00);
  137. writeD(0x00);
  138. writeD(0x00);
  139. writeD(0x00);
  140. writeD(0x00);
  141. writeD(0x00);
  142. writeD(charInfoPackage.getHairStyle());
  143. writeD(charInfoPackage.getHairColor());
  144. writeD(charInfoPackage.getFace());
  145. writeF(charInfoPackage.getMaxHp()); // hp max
  146. writeF(charInfoPackage.getMaxMp()); // mp max
  147. long deleteTime = charInfoPackage.getDeleteTimer();
  148. int deletedays = 0;
  149. if (deleteTime > 0)
  150. deletedays = (int)((deleteTime-System.currentTimeMillis())/1000);
  151. writeD(deletedays); // days left before
  152. // delete .. if != 0
  153. // then char is inactive
  154. writeD(charInfoPackage.getClassId());
  155. if (i == _activeId)
  156. writeD(0x01);
  157. else
  158. writeD(0x00); //c3 auto-select char
  159. writeC(charInfoPackage.getEnchantEffect() > 127 ? 127 : charInfoPackage.getEnchantEffect());
  160. writeH(charInfoPackage.getAugmentationId());
  161. writeH(0x00); // this is for augmentation too
  162. //writeD(charInfoPackage.getTransformId()); // Used to display Transformations
  163. writeD(0x00); // Currently on retail when you are on character select you don't see your transformation.
  164. }
  165. }
  166. private CharSelectInfoPackage[] loadCharacterSelectInfo()
  167. {
  168. CharSelectInfoPackage charInfopackage;
  169. List<CharSelectInfoPackage> characterList = new FastList<CharSelectInfoPackage>();
  170. java.sql.Connection con = null;
  171. try
  172. {
  173. con = L2DatabaseFactory.getInstance().getConnection();
  174. 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, rec_have, rec_left, accesslevel, online, char_slot, lastAccess, base_class, transform_id FROM characters WHERE account_name=?");
  175. statement.setString(1, _loginName);
  176. ResultSet charList = statement.executeQuery();
  177. while (charList.next())// fills the package
  178. {
  179. charInfopackage = restoreChar(charList);
  180. if ( charInfopackage != null )
  181. characterList.add(charInfopackage);
  182. }
  183. charList.close();
  184. statement.close();
  185. return characterList.toArray(new CharSelectInfoPackage[characterList.size()]);
  186. }
  187. catch (Exception e)
  188. {
  189. _log.warning("Could not restore char info: " + e);
  190. }
  191. finally
  192. {
  193. try { con.close(); } catch (Exception e) {}
  194. }
  195. return new CharSelectInfoPackage[0];
  196. }
  197. private void loadCharacterSubclassInfo(CharSelectInfoPackage charInfopackage, int ObjectId, int activeClassId)
  198. {
  199. java.sql.Connection con = null;
  200. try
  201. {
  202. con = L2DatabaseFactory.getInstance().getConnection();
  203. PreparedStatement statement = con.prepareStatement("SELECT exp, sp, level FROM character_subclasses WHERE char_obj_id=? && class_id=? ORDER BY char_obj_id");
  204. statement.setInt(1, ObjectId);
  205. statement.setInt(2, activeClassId);
  206. ResultSet charList = statement.executeQuery();
  207. if (charList.next())
  208. {
  209. charInfopackage.setExp(charList.getLong("exp"));
  210. charInfopackage.setSp(charList.getInt("sp"));
  211. charInfopackage.setLevel(charList.getInt("level"));
  212. }
  213. charList.close();
  214. statement.close();
  215. }
  216. catch (Exception e)
  217. {
  218. _log.warning("Could not restore char subclass info: " + e);
  219. }
  220. finally
  221. {
  222. try { con.close(); } catch (Exception e) {}
  223. }
  224. }
  225. private CharSelectInfoPackage restoreChar(ResultSet chardata) throws Exception
  226. {
  227. int objectId = chardata.getInt("obj_id");
  228. String name = chardata.getString("char_name");
  229. // See if the char must be deleted
  230. long deletetime = chardata.getLong("deletetime");
  231. if (deletetime > 0)
  232. {
  233. if (System.currentTimeMillis() > deletetime)
  234. {
  235. L2Clan clan = ClanTable.getInstance().getClan(chardata.getInt("clanid"));
  236. if(clan != null)
  237. clan.removeClanMember(name, 0);
  238. L2GameClient.deleteCharByObjId(objectId);
  239. return null;
  240. }
  241. }
  242. CharSelectInfoPackage charInfopackage = new CharSelectInfoPackage(objectId, name);
  243. charInfopackage.setLevel(chardata.getInt("level"));
  244. charInfopackage.setMaxHp(chardata.getInt("maxhp"));
  245. charInfopackage.setCurrentHp(chardata.getDouble("curhp"));
  246. charInfopackage.setMaxMp(chardata.getInt("maxmp"));
  247. charInfopackage.setCurrentMp(chardata.getDouble("curmp"));
  248. charInfopackage.setKarma(chardata.getInt("karma"));
  249. charInfopackage.setPkKills(chardata.getInt("pkkills"));
  250. charInfopackage.setFace(chardata.getInt("face"));
  251. charInfopackage.setHairStyle(chardata.getInt("hairstyle"));
  252. charInfopackage.setHairColor(chardata.getInt("haircolor"));
  253. charInfopackage.setSex(chardata.getInt("sex"));
  254. charInfopackage.setExp(chardata.getLong("exp"));
  255. charInfopackage.setSp(chardata.getInt("sp"));
  256. charInfopackage.setClanId(chardata.getInt("clanid"));
  257. charInfopackage.setRace(chardata.getInt("race"));
  258. final int baseClassId = chardata.getInt("base_class");
  259. final int activeClassId = chardata.getInt("classid");
  260. // if is in subclass, load subclass exp, sp, lvl info
  261. if(baseClassId != activeClassId)
  262. loadCharacterSubclassInfo(charInfopackage, objectId, activeClassId);
  263. charInfopackage.setClassId(activeClassId);
  264. // Get the augmentation id for equipped weapon
  265. int weaponObjId = charInfopackage.getPaperdollObjectId(Inventory.PAPERDOLL_LRHAND);
  266. if (weaponObjId < 1)
  267. weaponObjId = charInfopackage.getPaperdollObjectId(Inventory.PAPERDOLL_RHAND);
  268. // Check Transformation
  269. int cursedWeaponId = CursedWeaponsManager.getInstance().checkOwnsWeaponId(objectId);
  270. if (cursedWeaponId > 0)
  271. {
  272. // cursed weapon transformations
  273. if(cursedWeaponId == 8190)
  274. charInfopackage.setTransformId(301);
  275. else if(cursedWeaponId == 8689)
  276. charInfopackage.setTransformId(302);
  277. else
  278. charInfopackage.setTransformId(0);
  279. }
  280. else if (chardata.getInt("transform_id") > 0)
  281. {
  282. charInfopackage.setTransformId(chardata.getInt("transform_id"));
  283. }
  284. else
  285. charInfopackage.setTransformId(0);
  286. if (weaponObjId > 0)
  287. {
  288. java.sql.Connection con = null;
  289. try
  290. {
  291. con = L2DatabaseFactory.getInstance().getConnection();
  292. PreparedStatement statement = con.prepareStatement("SELECT attributes FROM augmentations WHERE item_id=?");
  293. statement.setInt(1, weaponObjId);
  294. ResultSet result = statement.executeQuery();
  295. if (result.next())
  296. {
  297. charInfopackage.setAugmentationId(result.getInt("attributes"));
  298. }
  299. result.close();
  300. statement.close();
  301. }
  302. catch (Exception e)
  303. {
  304. _log.warning("Could not restore augmentation info: " + e);
  305. }
  306. finally { try { con.close(); } catch (Exception e) {} }
  307. }
  308. /*
  309. * Check if the base class is set to zero and alse doesn't match
  310. * with the current active class, otherwise send the base class ID.
  311. *
  312. * This prevents chars created before base class was introduced
  313. * from being displayed incorrectly.
  314. */
  315. if (baseClassId == 0 && activeClassId > 0)
  316. charInfopackage.setBaseClassId(activeClassId);
  317. else
  318. charInfopackage.setBaseClassId(baseClassId);
  319. charInfopackage.setDeleteTimer(deletetime);
  320. charInfopackage.setLastAccess(chardata.getLong("lastAccess"));
  321. return charInfopackage;
  322. }
  323. @Override
  324. public String getType()
  325. {
  326. return _S__1F_CHARSELECTINFO;
  327. }
  328. }