/*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2, or (at your option)
* any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
* 02111-1307, USA.
*
* http://www.gnu.org/copyleft/gpl.html
*/
package net.sf.l2j.gameserver.clientpackets;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.nio.ByteBuffer;
import java.util.logging.Logger;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import java.util.regex.PatternSyntaxException;
import net.sf.l2j.Config;
import net.sf.l2j.L2DatabaseFactory;
import net.sf.l2j.gameserver.CharNameTable;
import net.sf.l2j.gameserver.CharTemplateTable;
import net.sf.l2j.gameserver.ClientThread;
import net.sf.l2j.gameserver.ItemTable;
import net.sf.l2j.gameserver.SkillTable;
import net.sf.l2j.gameserver.SkillTreeTable;
import net.sf.l2j.gameserver.TaskPriority;
import net.sf.l2j.gameserver.idfactory.IdFactory;
import net.sf.l2j.gameserver.model.L2ItemInstance;
import net.sf.l2j.gameserver.model.L2ShortCut;
import net.sf.l2j.gameserver.model.L2SkillLearn;
import net.sf.l2j.gameserver.model.L2World;
import net.sf.l2j.gameserver.model.actor.instance.L2PcInstance;
import net.sf.l2j.gameserver.serverpackets.CharCreateFail;
import net.sf.l2j.gameserver.serverpackets.CharCreateOk;
import net.sf.l2j.gameserver.serverpackets.CharSelectInfo;
import net.sf.l2j.gameserver.templates.L2Item;
import net.sf.l2j.gameserver.templates.L2PcTemplate;
/**
* This class ...
*
* @version $Revision: 1.9.2.3.2.8 $ $Date: 2005/03/27 15:29:30 $
*/
@SuppressWarnings("unused")
public class CharacterCreate extends ClientBasePacket
{
private static final String _C__0B_CHARACTERCREATE = "[C] 0B CharacterCreate";
private static Logger _log = Logger.getLogger(CharacterCreate.class.getName());
// cSdddddddddddd
private final String _name;
private final int _race;
private final int _sex;
private final int _classId;
private final int _int;
private final int _str;
private final int _con;
private final int _men;
private final int _dex;
private final int _wit;
private final int _hairStyle;
private final int _hairColor;
private final int _face;
public TaskPriority getPriority() { return TaskPriority.PR_HIGH; }
/**
* @param decrypt
*/
public CharacterCreate(ByteBuffer buf, ClientThread client)
{
super(buf, client);
_name = readS();
_race = readD();
_sex = readD();
_classId = readD();
_int = readD();
_str = readD();
_con = readD();
_men = readD();
_dex = readD();
_wit = readD();
_hairStyle = readD();
_hairColor = readD();
_face = readD();
}
void runImpl()
{
if (CharNameTable.getInstance().accountCharNumber(getClient().getLoginName()) >= Config.MAX_CHARACTERS_NUMBER_PER_ACCOUNT && Config.MAX_CHARACTERS_NUMBER_PER_ACCOUNT != 0)
{
if (Config.DEBUG)
_log.fine("Max number of characters reached. Creation failed.");
CharCreateFail ccf = new CharCreateFail(CharCreateFail.REASON_TOO_MANY_CHARACTERS);
sendPacket(ccf);
return;
}
else if (CharNameTable.getInstance().doesCharNameExist(_name))
{
if (Config.DEBUG)
_log.fine("charname: "+ _name + " already exists. creation failed.");
CharCreateFail ccf = new CharCreateFail(CharCreateFail.REASON_NAME_ALREADY_EXISTS);
sendPacket(ccf);
return;
}
else if ((_name.length() < 3) || (_name.length() > 16) || !isAlphaNumeric(_name) || !isValidName(_name))
{
if (Config.DEBUG)
_log.fine("charname: " + _name + " is invalid. creation failed.");
CharCreateFail ccf = new CharCreateFail(CharCreateFail.REASON_16_ENG_CHARS);
sendPacket(ccf);
return;
}
if (Config.DEBUG)
_log.fine("charname: " + _name + " classId: " + _classId);
L2PcTemplate template = CharTemplateTable.getInstance().getTemplate(_classId, _sex!=0);
int objectId = IdFactory.getInstance().getNextId();
L2PcInstance newChar = L2PcInstance.create(objectId, template, getClient().getLoginName(),
_name, _hairStyle, _hairColor, _face);
//newChar.setName(_name);
//newChar.setHairStyle(_hairStyle);
//newChar.setHairColor(_hairColor);
//newChar.setFace(_face);
newChar.setCurrentHp(template.baseHpMax);
newChar.setCurrentCp(template.baseCpMax);
newChar.setCurrentMp(template.baseMpMax);
//newChar.setMaxLoad(template.baseLoad);
// send acknowledgement
CharCreateOk cco = new CharCreateOk();
sendPacket(cco);
initNewChar(getClient(), newChar);
}
private boolean isAlphaNumeric(String text)
{
boolean result = true;
char[] chars = text.toCharArray();
for (int i = 0; i < chars.length; i++)
{
if (!Character.isLetterOrDigit(chars[i]))
{
result = false;
break;
}
}
return result;
}
private boolean isValidName(String text)
{
boolean result = true;
String test = text;
Pattern pattern;
try
{
pattern = Pattern.compile(Config.CNAME_TEMPLATE);
}
catch (PatternSyntaxException e) // case of illegal pattern
{
_log.warning("ERROR : Character name pattern of config is wrong!");
pattern = Pattern.compile(".*");
}
Matcher regexp = pattern.matcher(test);
if (!regexp.matches())
{
result = false;
}
//CHECK FOR ILLEGAL NAMES
java.sql.Connection con = null;
PreparedStatement statement = null;
ResultSet rs = null;
try
{
con = L2DatabaseFactory.getInstance().getConnection();
statement = con.prepareStatement("SELECT * FROM forbidden_names");
rs = statement.executeQuery();
while (rs.next())
{
if(rs.getString("name")==test)
result = false;
}
}
catch (Exception e)
{
_log.warning("CharacterCreate: Could not verify Charname: " + e);
}
return result;
}
private void initNewChar(ClientThread client, L2PcInstance newChar)
{
if (Config.DEBUG) _log.fine("Character init start");
L2World.getInstance().storeObject(newChar);
L2PcTemplate template = newChar.getTemplate();
newChar.addAdena("Init", Config.STARTING_ADENA, null, false);
newChar.setXYZInvisible(template.spawnX, template.spawnY, template.spawnZ);
newChar.setTitle("");
// if (newChar.isMale())
// {
// newChar.setMovementMultiplier(template.getMUnk1());
// newChar.setAttackSpeedMultiplier(template.getMUnk2());
// newChar.setCollisionRadius(template.getMColR());
// newChar.setCollisionHeight(template.getMColH());
// }
// else
// {
// newChar.setMovementMultiplier(template.getFUnk1());
// newChar.setAttackSpeedMultiplier(template.getFUnk2());
// newChar.setCollisionRadius(template.getFColR());
// newChar.setCollisionHeight(template.getFColH());
// }
L2ShortCut shortcut;
//add attack shortcut
shortcut = new L2ShortCut(0,0,3,2,-1,1);
newChar.registerShortCut(shortcut);
//add take shortcut
shortcut = new L2ShortCut(3,0,3,5,-1,1);
newChar.registerShortCut(shortcut);
//add sit shortcut
shortcut = new L2ShortCut(10,0,3,0,-1,1);
newChar.registerShortCut(shortcut);
ItemTable itemTable = ItemTable.getInstance();
L2Item[] items = template.getItems();
for (int i = 0; i < items.length; i++)
{
L2ItemInstance item = newChar.getInventory().addItem("Init", items[i].getItemId(), 1, newChar, null);
if (item.getItemId()==5588){
//add tutbook shortcut
shortcut = new L2ShortCut(11,0,1,item.getObjectId(),-1,1);
newChar.registerShortCut(shortcut);
}
if (item.isEquipable()){
if (newChar.getActiveWeaponItem() == null || !(item.getItem().getType2() != L2Item.TYPE2_WEAPON))
newChar.getInventory().equipItemAndRecord(item);
}
}
L2SkillLearn[] startSkills = SkillTreeTable.getInstance().getAvailableSkills(newChar, newChar.getClassId());
for (int i = 0; i < startSkills.length; i++)
{
newChar.addSkill(SkillTable.getInstance().getInfo(startSkills[i].getId(), startSkills[i].getLevel()));
if (startSkills[i].getId()==1001 || startSkills[i].getId()==1177){
shortcut = new L2ShortCut(1,0,2,startSkills[i].getId(),1,1);
newChar.registerShortCut(shortcut);
}
if (startSkills[i].getId()==1216){
shortcut = new L2ShortCut(10,0,2,startSkills[i].getId(),1,1);
newChar.registerShortCut(shortcut);
}
if (Config.DEBUG)
_log.fine("adding starter skill:" + startSkills[i].getId()+ " / "+ startSkills[i].getLevel());
}
ClientThread.saveCharToDisk(newChar);
newChar.deleteMe(); // release the world of this character and it's inventory
// send char list
CharSelectInfo cl = new CharSelectInfo(client.getLoginName(), client.getSessionId().playOkID1);
client.getConnection().sendPacket(cl);
client.setCharSelection(cl.getCharInfo());
if (Config.DEBUG) _log.fine("Character init end");
}
/* (non-Javadoc)
* @see net.sf.l2j.gameserver.clientpackets.ClientBasePacket#getType()
*/
public String getType()
{
return _C__0B_CHARACTERCREATE;
}
}