CharacterCreate.java 8.6 KB

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