CharSelectionInfo.java 14 KB

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