Jump to content
  • 0

Set Character Noblesse In Charactercreate.java


Question

Posted

Ok well as the title says I am trying to set characters noblesse from the moment they are created.

 

I don't want to just do a simple enterworld check so I am trying to set them noblesse from creation.

 

Here is what I have coded so far:

In charactercreate.java:

//SWS FACTION MOD
	if (Config.FACTION_SYSTEM_NEW_CHAR_NOBLE)
	{
		newChar.setNoble(true);
	}

 

So its just a simple config check and execute parameter. About as simple as code gets.

 

So i went ingame to test if it worked and it set my character noblesse. I checked from the database there is a 1 in the noblesse column

 

But i got this error at gameserver when i created the new character:

storeSkill() couldn't store new skill. It's null type.

 

Here is my whole charactercreate.java:

/*
* 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.network.clientpackets;

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.gameserver.datatables.CharNameTable;
import net.sf.l2j.gameserver.datatables.CharTemplateTable;
import net.sf.l2j.gameserver.datatables.SkillTable;
import net.sf.l2j.gameserver.datatables.SkillTreeTable;
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.network.L2GameClient;
import net.sf.l2j.gameserver.network.serverpackets.CharCreateFail;
import net.sf.l2j.gameserver.network.serverpackets.CharCreateOk;
import net.sf.l2j.gameserver.network.serverpackets.CharSelectInfo;
import net.sf.l2j.gameserver.templates.chars.L2PcTemplate;
import net.sf.l2j.gameserver.templates.item.L2Item;
import net.sf.l2j.gameserver.util.Util;

public final class CharacterCreate extends L2GameClientPacket
{
private static final String _C__0B_CHARACTERCREATE = "[C] 0B CharacterCreate";
private static Logger _log = Logger.getLogger(CharacterCreate.class.getName());

// cSdddddddddddd
private String _name;
    //private int _race;
private byte _sex;
private int _classId;
//private int _int;
//private int _str;
//private int _con;
//private int _men;
//private int _dex;
//private int _wit;
private byte _hairStyle;
private byte _hairColor;
private byte _face;

@Override
protected void readImpl()
{
	_name      = readS();
	/*_race      = */readD();
	_sex       = (byte)readD();
	_classId   = readD();
	/*_int       = */readD();
	/*_str       = */readD();
	/*_con       = */readD();
	/*_men       = */readD();
	/*_dex       = */readD();
	/*_wit       = */readD();
	_hairStyle = (byte)readD();
	_hairColor = (byte)readD();
	_face      = (byte)readD();
}

@Override
protected void runImpl()
{
	if ((_name.length() < 1) || (_name.length() > 16) || !Util.isAlphaNumeric(_name) || !isValidName(_name))
	{
		if (Config.DEBUG)
			_log.fine("Character Creation Failure: name " + _name + " is invalid. Creation have failed.");

		sendPacket(new CharCreateFail(CharCreateFail.REASON_16_ENG_CHARS));
		return;
	}

	if (_face > 2 || _face < 0)
	{
		_log.warning("Character Creation Failure: Character face " + _face + " is invalid. Possible client hack: "+getClient());

		sendPacket(new CharCreateFail(CharCreateFail.REASON_CREATION_FAILED));
		return;
	}

	if (_hairStyle < 0 || (_sex == 0 && _hairStyle > 4) || (_sex != 0 && _hairStyle > 6))
	{
		_log.warning("Character Creation Failure: Character hair style " + _hairStyle + " is invalid. Possible client hack: "+getClient());

		sendPacket(new CharCreateFail(CharCreateFail.REASON_CREATION_FAILED));
		return;
	}

	if (_hairColor > 3 || _hairColor < 0)
	{
		_log.warning("Character Creation Failure: Character hair color " + _hairColor + " is invalid. Possible client hack: "+getClient());

		sendPacket(new CharCreateFail(CharCreateFail.REASON_CREATION_FAILED));
		return;
	}

	L2PcInstance newChar = null;
	L2PcTemplate template = null;

	/*
	 * DrHouse: Since checks for duplicate names are done using SQL, lock must be held until data is written to DB as well.
	 */
	synchronized (CharNameTable.getInstance())
	{
        if (CharNameTable.getInstance().accountCharNumber(getClient().getAccountName()) >= 7)
        {
            if (Config.DEBUG)
                _log.fine("Max number of characters reached. Creation failed.");
            
			sendPacket(new CharCreateFail(CharCreateFail.REASON_TOO_MANY_CHARACTERS));
            return;
        }
        else if (CharNameTable.getInstance().doesCharNameExist(_name))
		{
			if (Config.DEBUG)
				_log.fine("Character Creation Failure: "+ _name + " already exists. Creation have failed.");

			sendPacket(new CharCreateFail(CharCreateFail.REASON_NAME_ALREADY_EXISTS));
			return;
		}

		template = CharTemplateTable.getInstance().getTemplate(_classId);
		if (template == null || template.classBaseLevel > 1)
		{
			sendPacket(new CharCreateFail(CharCreateFail.REASON_CREATION_FAILED));
			return;
		}

		int objectId = IdFactory.getInstance().getNextId();
		newChar = L2PcInstance.create(objectId, template, getClient().getAccountName(), _name, _hairStyle, _hairColor, _face, _sex!=0);
	}

	newChar.setCurrentHp(template.baseHpMax);
	newChar.setCurrentCp(template.baseCpMax);
	newChar.setCurrentMp(template.baseMpMax);

	// send acknowledgement
	sendPacket(new CharCreateOk());
	initNewChar(getClient(), newChar);
}

    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;

	return result;
    }

private void initNewChar(L2GameClient 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);
	//SWS FACTION MOD
	if (Config.FACTION_SYSTEM_NEW_CHAR_ALLOW_ALT_SPAWN)
	{
		newChar.setXYZInvisible(Config.FACTION_SYSTEM_NEW_CHAR_SPAWN_X, Config.FACTION_SYSTEM_NEW_CHAR_SPAWN_Y , Config.FACTION_SYSTEM_NEW_CHAR_SPAWN_Z);
	}
	//SWS FACTION MOD
	if (Config.FACTION_SYSTEM_ENABLE_NEW_CHAR_TITLE)
	{
		newChar.setTitle(Config.FACTION_SYSTEM_SET_NEW_CHAR_TITLE);
	}
	//SWS FACTION MOD
	if (Config.FACTION_SYSTEM_NEW_CHAR_NOBLE)
	{
		newChar.setNoble(true);
	}
	//SWS FACTION MOD
	if (Config.FACTION_SYSTEM_ENABLE_SET_NEW_CHAR_LEVEL)
	{
		newChar.getStat().addLevel((byte)(Config.FACTION_SYSTEM_SET_NEW_CHAR_LEVEL-1));
	}


	newChar.registerShortCut(new L2ShortCut(0,0,3,2,-1,1)); 	// attack shortcut
	newChar.registerShortCut(new L2ShortCut(3,0,3,5,-1,1)); 	// take shortcut
	newChar.registerShortCut(new L2ShortCut(10,0,3,0,-1,1)); 	// sit shortcut

	L2Item[] items = template.getItems();
	for (int i = 0; i < items.length; i++)
	{
		L2ItemInstance item = newChar.getInventory().addItem("Init", items[i].getItemId(), 1, newChar, null);
		// tutbook shortcut
		if (item.getItemId()==5588)
		    newChar.registerShortCut(new L2ShortCut(11,0,1,item.getObjectId(),-1,1));

		if (item.isEquipable())
		{
			if (newChar.getActiveWeaponItem() == null || !(item.getItem().getType2() != L2Item.TYPE2_WEAPON))
				newChar.getInventory().equipItemAndRecord(item);
		}
	}

	for (L2SkillLearn skill : SkillTreeTable.getInstance().getAvailableSkills(newChar, newChar.getClassId()))
	{
		newChar.addSkill(SkillTable.getInstance().getInfo(skill.getId(), skill.getLevel()), true);
		if (skill.getId() == 1001 || skill.getId() == 1177)
		    newChar.registerShortCut(new L2ShortCut(1,0,2,skill.getId(),1,1));

		if (skill.getId()==1216)
		    newChar.registerShortCut(new L2ShortCut(10,0,2,skill.getId(),1,1));

		if (Config.DEBUG)
			_log.fine("adding starter skill:" + skill.getId()+ " / "+ skill.getLevel());
	}

	newChar.setOnlineStatus(true, false);
	newChar.deleteMe();

	CharSelectInfo cl =	new CharSelectInfo(client.getAccountName(), client.getSessionId().playOkID1);
	client.getConnection().sendPacket(cl);
        client.setCharSelection(cl.getCharInfo());
        
        if (Config.DEBUG)
        	_log.fine("Character init end");
}

@Override
public String getType()
{
	return _C__0B_CHARACTERCREATE;
}
}

 

2 answers to this question

Recommended Posts

Guest
This topic is now closed to further replies.


  • Posts

    • TG Support: https://t.me/buyingproxysup | Channel: https://t.me/buyingproxycom Discord support: #buyingproxy | Server: Join the BuyingProxy Discord Server! Create your free account here  
    • I've purchased the Samurai interface. Everything went smoothly, and the interface is excellent. Highly recommended!
    • For quick reference, I’ve been using the D12 dice roller when testing dice mechanics—clean design and instant results help a lot. It might give you a solid visual template to work from as you build your own games.
    • 🪙 GoldRush — High Five x20 🪙   A fresh High Five server focused on active progression, fair competition, and a healthy player-driven economy.   GoldRush is built for players who want a fresh spin on our beloved game that is connected to today's world via Web3 marketplace.    🏅 Gold Bar & Marketplace • Gold Bars are part of the server's custom economy — they can be used in Marketplace or Cosmetics shop. • Tokens are optional and used only for server Marketplace features.   ⚙️ Server Rates • EXP: 20x • SP: 20x • Adena: 10x • Normal Drop Chance: 8x • Spoil Chance: 12x • Raid Drop Chance: 3x • Quest Item Drop Amount: 5x • Quest EXP/SP Reward: 10x • Quest Adena Reward: 5x   ✨ Enchant Rates • Max Enchant: Weapons +16 / Armors +12 • +0 to +3 armor / weapon = 100% safe • +0 to +4 full body armor = 100% safe • +4 to +6 = 66% • +7 to +9 = 60% • +10 to +12 = 54% • +13 to +14 = 48% • +15 to +16 = 42%   🛒 Alt+B Services GoldRush includes useful Alt+B services: • GM Shop up to Dynasty • Buffer 1h • Teleports • Drop Search • Rankings   🎒 Auto-Loot • Normal mob drops: auto-loot • Adena: auto-loot • Raid drops: stay on the ground • Herbs: stay on the ground   🧙 Class Progression • 1st and 2nd professions are free with shadow weapon reward. • 3rd profession: 5kk • Auto Learn Skills • Subclass - No Quest • Noblesse - Full Quest     ⚔️ Olympiad • Hero period: 1 week • Olympiad time: 18:00–00:00 server time • Match duration: 5 minutes • Max enchant in Olympiad: +6   🏰 Sieges Castle sieges take place on Sundays at 16:00 and 20:00 GMT+3. The first siege will happen 2 weeks after launch.   🐉 Grand Boss Respawn Queen Ant: 24h + 2h random Core: 30h + 2h random Orfen: 48h + 2h random Baium: 120h + 3h random Antharas: 120h + 24h random Valakas: 120h + 24h random Beleth: 120h + 24h random   ⚔️ Fair Play Bots are strictly forbidden and will result in a ban without warning. Dualbox is limited to 1 box. GoldRush is built around a healthy player-to-player economy. Website : https://www.goldrushpvp.xyz/ Discord : https://discord.com/invite/v3zRZVV6ka Guide of how to make an account on our web3 server!  
    • Patch notes of update v1.0 is done regarding some feedbacks. Added Special Buffs category to the buffer. Queen Cat, Seraphim and Dwarf equipment buffs are now available. Special buffs last 1 hour and can be saved in schemes. Players can now Shift+Click monsters to check drops and spoil directly in-game.
  • Topics

×
×
  • Create New...

Important Information

This community uses essential cookies to function properly. Non-essential cookies and third-party services are used only with your consent. Read our Privacy Policy and We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue..