Сообщений: 2
Тем: 1
Зарегистрирован: Nov 2015
Репутация:
0
При создании персонажа он попадает на координаты 0,0,0
За исключением если это персонаж хум маг или орк маг, они респаются на верных координатах из char_templates. Логи выдают данную ошибку
Помогите пожалуйста разобраться, все форумы уже облазил
При создании мага хума или орка, ошибки нет.
Сообщений: 5,863
Тем: 105
Зарегистрирован: Sep 2010
Репутация:
13,014
Сообщений: 2,455
Тем: 53
Зарегистрирован: Apr 2010
Репутация:
19,728
Чето ощущение, что Вы пытаетесь персонажу одеть в руку какой-нибудь варниш, при его создании. Либо очень странный баг в коде.
m0nster.art - clear client patches, linkz to utils & code.
Гадаю по капче.
Сообщений: 2
Тем: 1
Зарегистрирован: Nov 2015
Репутация:
0
11-14-2015, 03:02 AM
(Сообщение последний раз редактировалось: 11-14-2015, 03:15 AM zaq1993.)
Pointer*Rage Написал:Чето ощущение, что Вы пытаетесь персонажу одеть в руку какой-нибудь варниш, при его создании. Либо очень странный баг в коде.
В том то и дело, что все персонажи создаются пустые -( Вне зависимости от расы. А и если создать хума мага, он правильно респается и тоже создается пустой.
А еще есть очень странная! Фигня. Уж не знаю какое литературное слово тут найти.
Если в таблице char_templates изменить ClassId и взять id человека мага (10) и поставить этот id магу темного эльфа (DE Mage), а человеку магу поставить id 38 соответственно (id темного мага) ТО! при создании в игре мага человека будет создан маг темный эльфа и заспаунится на координатах корректных для темного эльфа. А если создать темного эльфа мага - получится вообще гномка и попадет на координаты (0,0,0)
Вот CharacterCreate из ядра, вроде ничего нету криминального.
Я уже не знаю, где мне помощи искать -(
Неделю бьюсь с этим.
Код: // Decompiled by DJ v3.12.12.96 Copyright 2011 Atanas Neshkov Date: 13.11.2015 15:46:45
// Home Page: http://members.fortunecity.com/neshkov/dj.html http://www.neshkov.com/dj.html - Check often for new version!
// Decompiler options: packimports(3)
// Source File Name: CharacterCreate.java
package net.sf.l2j.gameserver.network.clientpackets;
import java.util.Iterator;
import java.util.List;
import java.util.logging.Logger;
import java.util.regex.*;
import net.sf.l2j.Config;
import net.sf.l2j.gameserver.LoginServerThread;
import net.sf.l2j.gameserver.datatables.*;
import net.sf.l2j.gameserver.idfactory.IdFactory;
import net.sf.l2j.gameserver.instancemanager.QuestManager;
import net.sf.l2j.gameserver.model.*;
import net.sf.l2j.gameserver.model.actor.instance.L2PcInstance;
import net.sf.l2j.gameserver.model.itemcontainer.PcInventory;
import net.sf.l2j.gameserver.model.quest.Quest;
import net.sf.l2j.gameserver.model.quest.QuestState;
import net.sf.l2j.gameserver.network.L2GameClient;
import net.sf.l2j.gameserver.network.serverpackets.*;
import net.sf.l2j.gameserver.templates.L2PcTemplate;
import net.sf.l2j.gameserver.util.Util;
import org.mmocore.network.MMOConnection;
// Referenced classes of package net.sf.l2j.gameserver.network.clientpackets:
// L2GameClientPacket
public final class CharacterCreate extends L2GameClientPacket
{
public CharacterCreate()
{
}
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();
}
protected void runImpl()
{
if(CharNameTable.getInstance().accountCharNumber(((L2GameClient)getClient()).getAccountName()) >= 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(1);
sendPacket(ccf);
return;
}
if(CharNameTable.getInstance().doesCharNameExist(_name))
{
if(Config.DEBUG)
_log.fine((new StringBuilder()).append("charname: ").append(_name).append(" already exists. creation failed.").toString());
CharCreateFail ccf = new CharCreateFail(2);
sendPacket(ccf);
return;
}
if(_name.length() < 3 || _name.length() > 16 || !Util.isAlphaNumeric(_name) || !isValidName(_name))
{
if(Config.DEBUG)
_log.fine((new StringBuilder()).append("charname: ").append(_name).append(" is invalid. creation failed.").toString());
CharCreateFail ccf = new CharCreateFail(3);
sendPacket(ccf);
return;
}
L2PcTemplate template = CharTemplateTable.getInstance().getTemplate(_classId);
if(Config.DEBUG)
_log.fine((new StringBuilder()).append("charname: ").append(_name).append(" classId: ").append(_classId).append(" template: ").append(template).toString());
if(template == null || template.classBaseLevel > 1)
{
CharCreateFail ccf = new CharCreateFail(0);
sendPacket(ccf);
return;
} else
{
int objectId = IdFactory.getInstance().getNextId();
L2PcInstance newChar = L2PcInstance.create(objectId, template, ((L2GameClient)getClient()).getAccountName(), _name, _hairStyle, _hairColor, _face, _sex != 0);
newChar.setCurrentHp(template.baseHpMax);
newChar.setCurrentCp(template.baseCpMax);
newChar.setCurrentMp(template.baseMpMax);
CharCreateOk cco = new CharCreateOk();
sendPacket(cco);
initNewChar((L2GameClient)getClient(), newChar);
return;
}
}
private boolean isValidName(String text)
{
boolean result = true;
String test = text;
Pattern pattern;
try
{
pattern = Pattern.compile(Config.CNAME_TEMPLATE);
}
catch(PatternSyntaxException e)
{
_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);
newChar.setXYZInvisible(template.spawnX, template.spawnY, template.spawnZ);
newChar.setTitle("");
L2ShortCut shortcut = new L2ShortCut(0, 0, 3, 2, -1, 1);
newChar.registerShortCut(shortcut);
shortcut = new L2ShortCut(3, 0, 3, 5, -1, 1);
newChar.registerShortCut(shortcut);
shortcut = new L2ShortCut(10, 0, 3, 0, -1, 1);
newChar.registerShortCut(shortcut);
Iterator i$ = template.getItems().iterator();
do
{
if(!i$.hasNext())
break;
net.sf.l2j.gameserver.templates.L2PcTemplate.PcTemplateItem ia = (net.sf.l2j.gameserver.templates.L2PcTemplate.PcTemplateItem)i$.next();
L2ItemInstance item = newChar.getInventory().addItem("Init", ia.getItemId(), ia.getAmount(), newChar, null);
if(item.getItemId() == 5588)
{
shortcut = new L2ShortCut(11, 0, 1, item.getObjectId(), -1, 1);
newChar.registerShortCut(shortcut);
}
if(item.isEquipable() && ia.isEquipped())
newChar.getInventory().equipItemAndRecord(item);
} while(true);
L2SkillLearn arr$[] = SkillTreeTable.getInstance().getAvailableSkills(newChar, newChar.getClassId());
int len$ = arr$.length;
for(int i$ = 0; i$ < len$; i$++)
{
L2SkillLearn skill = arr$[i$];
newChar.addSkill(SkillTable.getInstance().getInfo(skill.getId(), skill.getLevel()), true);
if(skill.getId() == 1001 || skill.getId() == 1177)
{
shortcut = new L2ShortCut(1, 0, 2, skill.getId(), 1, 1);
newChar.registerShortCut(shortcut);
}
if(skill.getId() == 1216)
{
shortcut = new L2ShortCut(10, 0, 2, skill.getId(), 1, 1);
newChar.registerShortCut(shortcut);
}
if(Config.DEBUG)
_log.fine((new StringBuilder()).append("adding starter skill:").append(skill.getId()).append(" / ").append(skill.getLevel()).toString());
}
startTutorialQuest(newChar);
L2GameClient.saveCharToDisk(newChar);
newChar.deleteMe();
CharSelectionInfo cl = new CharSelectionInfo(client.getAccountName(), client.getSessionId().playOkID1);
client.getConnection().sendPacket(cl);
client.setCharSelection(cl.getCharInfo());
if(Config.DEBUG)
_log.fine("Character init end");
}
public void startTutorialQuest(L2PcInstance player)
{
QuestState qs = player.getQuestState("255_Tutorial");
Quest q = null;
if(qs == null)
q = QuestManager.getInstance().getQuest("255_Tutorial");
if(q != null)
q.newQuestState(player);
}
public String getType()
{
return "[C] 0B CharacterCreate";
}
private static final String _C__0B_CHARACTERCREATE = "[C] 0B CharacterCreate";
private static Logger _log = Logger.getLogger(net/sf/l2j/gameserver/network/clientpackets/CharacterCreate.getName());
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;
}
P.S.
Я уже почти все форумы наверное обошел с этим вопросом. Вы не подумайте, я не нахлебник, которому нужно чтобы за него все сделали. Я привык сам решать проблемы, но тут просто - у меня закончились все идеи. Тупик. Мне хотя бы просто ваши размышления по этому поводу и идеи в какую сторону мне копать
Добавлено через 13 минут
Zubastic Написал:Исходники то есть?
Это для меня совсем новое занятие, поэтому я не очень уверен в далее сказанном. Ядро сервера - l2jserver. Насколько я понял из литературы это именно оно. Именно его надо править. Оно в формате .jar и если я не ошибаюсь его можно редактировать. Верно?
Это вы спрашивали?
Сообщений: 2,455
Тем: 53
Зарегистрирован: Apr 2010
Репутация:
19,728
Class id привязаны в клиенте к расе, если память меня не подводит, поэтому лучше так не экспериментировать.
Цитата:Это для меня совсем новое занятие, поэтому я не очень уверен в далее сказанном. Ядро сервера - l2jserver. Насколько я понял из литературы это именно оно. Именно его надо править. Оно в формате .jar и если я не ошибаюсь его можно редактировать. Верно?
Все вокруг l2j, даже феникс. А так, ключевой комментарий:
Цитата:// Decompiled
Я очень сомневаюсь, что Вы сможете собрать все назад после правок. В особенности, на классах +10к строк кода, как например L2PcInstance, в который лучше заглянуть, на 2238 строку кода.
m0nster.art - clear client patches, linkz to utils & code.
Гадаю по капче.
|