CharacterCreate.java 8.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238
  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.clientpackets;
  16. import java.util.logging.Logger;
  17. import java.util.regex.Matcher;
  18. import java.util.regex.Pattern;
  19. import java.util.regex.PatternSyntaxException;
  20. import net.sf.l2j.Config;
  21. import net.sf.l2j.gameserver.datatables.CharNameTable;
  22. import net.sf.l2j.gameserver.datatables.CharTemplateTable;
  23. import net.sf.l2j.gameserver.datatables.ItemTable;
  24. import net.sf.l2j.gameserver.datatables.SkillTable;
  25. import net.sf.l2j.gameserver.datatables.SkillTreeTable;
  26. import net.sf.l2j.gameserver.idfactory.IdFactory;
  27. import net.sf.l2j.gameserver.model.L2ItemInstance;
  28. import net.sf.l2j.gameserver.model.L2ShortCut;
  29. import net.sf.l2j.gameserver.model.L2SkillLearn;
  30. import net.sf.l2j.gameserver.model.L2World;
  31. import net.sf.l2j.gameserver.model.actor.instance.L2PcInstance;
  32. import net.sf.l2j.gameserver.network.L2GameClient;
  33. import net.sf.l2j.gameserver.serverpackets.CharCreateFail;
  34. import net.sf.l2j.gameserver.serverpackets.CharCreateOk;
  35. import net.sf.l2j.gameserver.serverpackets.CharSelectionInfo;
  36. import net.sf.l2j.gameserver.templates.L2Item;
  37. import net.sf.l2j.gameserver.templates.L2PcTemplate;
  38. import net.sf.l2j.gameserver.util.Util;
  39. /**
  40. * This class ...
  41. *
  42. * @version $Revision: 1.9.2.3.2.8 $ $Date: 2005/03/27 15:29:30 $
  43. */
  44. @SuppressWarnings("unused")
  45. public final class CharacterCreate extends L2GameClientPacket
  46. {
  47. private static final String _C__0B_CHARACTERCREATE = "[C] 0B CharacterCreate";
  48. private static Logger _log = Logger.getLogger(CharacterCreate.class.getName());
  49. // cSdddddddddddd
  50. private String _name;
  51. private int _race;
  52. private byte _sex;
  53. private int _classId;
  54. private int _int;
  55. private int _str;
  56. private int _con;
  57. private int _men;
  58. private int _dex;
  59. private int _wit;
  60. private byte _hairStyle;
  61. private byte _hairColor;
  62. private byte _face;
  63. @Override
  64. protected void readImpl()
  65. {
  66. _name = readS();
  67. _race = readD();
  68. _sex = (byte)readD();
  69. _classId = readD();
  70. _int = readD();
  71. _str = readD();
  72. _con = readD();
  73. _men = readD();
  74. _dex = readD();
  75. _wit = readD();
  76. _hairStyle = (byte)readD();
  77. _hairColor = (byte)readD();
  78. _face = (byte)readD();
  79. }
  80. @Override
  81. protected void runImpl()
  82. {
  83. if (CharNameTable.getInstance().accountCharNumber(getClient().getAccountName()) >= Config.MAX_CHARACTERS_NUMBER_PER_ACCOUNT && Config.MAX_CHARACTERS_NUMBER_PER_ACCOUNT != 0)
  84. {
  85. if (Config.DEBUG)
  86. _log.fine("Max number of characters reached. Creation failed.");
  87. CharCreateFail ccf = new CharCreateFail(CharCreateFail.REASON_TOO_MANY_CHARACTERS);
  88. sendPacket(ccf);
  89. return;
  90. }
  91. else if (CharNameTable.getInstance().doesCharNameExist(_name))
  92. {
  93. if (Config.DEBUG)
  94. _log.fine("charname: "+ _name + " already exists. creation failed.");
  95. CharCreateFail ccf = new CharCreateFail(CharCreateFail.REASON_NAME_ALREADY_EXISTS);
  96. sendPacket(ccf);
  97. return;
  98. }
  99. else if ((_name.length() < 3) || (_name.length() > 16) || !Util.isAlphaNumeric(_name) || !isValidName(_name))
  100. {
  101. if (Config.DEBUG)
  102. _log.fine("charname: " + _name + " is invalid. creation failed.");
  103. CharCreateFail ccf = new CharCreateFail(CharCreateFail.REASON_16_ENG_CHARS);
  104. sendPacket(ccf);
  105. return;
  106. }
  107. L2PcTemplate template = CharTemplateTable.getInstance().getTemplate(_classId);
  108. if (Config.DEBUG || true)
  109. _log.fine("charname: " + _name + " classId: " + _classId+" tempalte: "+template);
  110. if(template == null || template.classBaseLevel > 1)
  111. {
  112. CharCreateFail ccf = new CharCreateFail(CharCreateFail.REASON_CREATION_FAILED);
  113. sendPacket(ccf);
  114. return;
  115. }
  116. int objectId = IdFactory.getInstance().getNextId();
  117. L2PcInstance newChar = L2PcInstance.create(objectId, template, getClient().getAccountName(),
  118. _name, _hairStyle, _hairColor, _face, _sex!=0);
  119. newChar.setCurrentHp(template.baseHpMax);
  120. newChar.setCurrentCp(template.baseCpMax);
  121. newChar.setCurrentMp(template.baseMpMax);
  122. //newChar.setMaxLoad(template.baseLoad);
  123. // send acknowledgement
  124. CharCreateOk cco = new CharCreateOk();
  125. sendPacket(cco);
  126. initNewChar(getClient(), newChar);
  127. }
  128. private boolean isValidName(String text)
  129. {
  130. boolean result = true;
  131. String test = text;
  132. Pattern pattern;
  133. try
  134. {
  135. pattern = Pattern.compile(Config.CNAME_TEMPLATE);
  136. }
  137. catch (PatternSyntaxException e) // case of illegal pattern
  138. {
  139. _log.warning("ERROR : Character name pattern of config is wrong!");
  140. pattern = Pattern.compile(".*");
  141. }
  142. Matcher regexp = pattern.matcher(test);
  143. if (!regexp.matches())
  144. {
  145. result = false;
  146. }
  147. return result;
  148. }
  149. private void initNewChar(L2GameClient client, L2PcInstance newChar)
  150. {
  151. if (Config.DEBUG) _log.fine("Character init start");
  152. L2World.getInstance().storeObject(newChar);
  153. L2PcTemplate template = newChar.getTemplate();
  154. newChar.addAdena("Init", Config.STARTING_ADENA, null, false);
  155. newChar.setXYZInvisible(template.spawnX, template.spawnY, template.spawnZ);
  156. newChar.setTitle("");
  157. L2ShortCut shortcut;
  158. //add attack shortcut
  159. shortcut = new L2ShortCut(0,0,3,2,-1,1);
  160. newChar.registerShortCut(shortcut);
  161. //add take shortcut
  162. shortcut = new L2ShortCut(3,0,3,5,-1,1);
  163. newChar.registerShortCut(shortcut);
  164. //add sit shortcut
  165. shortcut = new L2ShortCut(10,0,3,0,-1,1);
  166. newChar.registerShortCut(shortcut);
  167. ItemTable itemTable = ItemTable.getInstance();
  168. L2Item[] items = template.getItems();
  169. for (int i = 0; i < items.length; i++)
  170. {
  171. L2ItemInstance item = newChar.getInventory().addItem("Init", items[i].getItemId(), 1, newChar, null);
  172. if (item.getItemId()==5588){
  173. //add tutbook shortcut
  174. shortcut = new L2ShortCut(11,0,1,item.getObjectId(),-1,1);
  175. newChar.registerShortCut(shortcut);
  176. }
  177. if (item.isEquipable()){
  178. if (newChar.getActiveWeaponItem() == null || !(item.getItem().getType2() != L2Item.TYPE2_WEAPON))
  179. newChar.getInventory().equipItemAndRecord(item);
  180. }
  181. }
  182. L2SkillLearn[] startSkills = SkillTreeTable.getInstance().getAvailableSkills(newChar, newChar.getClassId());
  183. for (int i = 0; i < startSkills.length; i++)
  184. {
  185. newChar.addSkill(SkillTable.getInstance().getInfo(startSkills[i].getId(), startSkills[i].getLevel()), true);
  186. if (startSkills[i].getId()==1001 || startSkills[i].getId()==1177){
  187. shortcut = new L2ShortCut(1,0,2,startSkills[i].getId(),1,1);
  188. newChar.registerShortCut(shortcut);
  189. }
  190. if (startSkills[i].getId()==1216){
  191. shortcut = new L2ShortCut(10,0,2,startSkills[i].getId(),1,1);
  192. newChar.registerShortCut(shortcut);
  193. }
  194. if (Config.DEBUG)
  195. _log.fine("adding starter skill:" + startSkills[i].getId()+ " / "+ startSkills[i].getLevel());
  196. }
  197. L2GameClient.saveCharToDisk(newChar);
  198. newChar.deleteMe(); // release the world of this character and it's inventory
  199. // send char list
  200. CharSelectionInfo cl = new CharSelectionInfo(client.getAccountName(), client.getSessionId().playOkID1);
  201. client.getConnection().sendPacket(cl);
  202. client.setCharSelection(cl.getCharInfo());
  203. if (Config.DEBUG) _log.fine("Character init end");
  204. }
  205. /* (non-Javadoc)
  206. * @see net.sf.l2j.gameserver.clientpackets.ClientBasePacket#getType()
  207. */
  208. public String getType()
  209. {
  210. return _C__0B_CHARACTERCREATE;
  211. }
  212. }