/**
* This file is part of aion-emu <aion-emu.com>.
*
* aion-emu 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 3 of the License, or
* (at your option) any later version.
*
* aion-emu 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 aion-emu. If not, see <http://www.gnu.org/licenses/>.
*/
package com.aionemu.gameserver.network.aion;
import java.nio.ByteBuffer;
import java.util.List;
import com.aionemu.gameserver.model.account.PlayerAccountData;
import com.aionemu.gameserver.model.gameobjects.Item;
import com.aionemu.gameserver.model.gameobjects.player.PlayerAppearance;
import com.aionemu.gameserver.model.gameobjects.player.PlayerCommonData;
import com.aionemu.gameserver.model.items.GodStone;
import com.aionemu.gameserver.model.items.ItemSlot;
/**
*
* @author AEJTester
* @author Nemesiss
* @author Niato
*/
public abstract class PlayerInfo extends AionServerPacket
{
protected PlayerInfo()
{
}
protected void writePlayerInfo(ByteBuffer buf, PlayerAccountData accPlData)
{
PlayerCommonData pbd = accPlData.getPlayerCommonData();
final int raceId = pbd.getRace().getRaceId();
final int genderId = pbd.getGender().getGenderId();
final PlayerAppearance playerAppearance = accPlData.getAppereance();
writeD(buf, pbd.getPlayerObjId());
writeS(buf, pbd.getName());
/**
* Stupid NC...
*/
int size = 44 - (pbd.getName().length() * 2 + 2);
byte[] stupidNc = new byte[size];
writeB(buf, stupidNc);
writeD(buf, genderId);
writeD(buf, raceId);
writeD(buf, pbd.getPlayerClass().getClassId());
writeD(buf, playerAppearance.getVoice());
writeD(buf, playerAppearance.getSkinRGB());
writeD(buf, playerAppearance.getHairRGB());
writeD(buf, playerAppearance.getEyeRGB());
writeD(buf, playerAppearance.getLipRGB());
writeC(buf, playerAppearance.getFace());
writeC(buf, playerAppearance.getHair());
writeC(buf, playerAppearance.getDeco());
writeC(buf, playerAppearance.getTattoo());
writeC(buf, 4);// always 4 o0
writeC(buf, playerAppearance.getFaceShape());
writeC(buf, playerAppearance.getForehead());
writeC(buf, playerAppearance.getEyeHeight());
writeC(buf, playerAppearance.getEyeSpace());
writeC(buf, playerAppearance.getEyeWidth());
writeC(buf, playerAppearance.getEyeSize());
writeC(buf, playerAppearance.getEyeShape());
writeC(buf, playerAppearance.getEyeAngle());
writeC(buf, playerAppearance.getBrowHeight());
writeC(buf, playerAppearance.getBrowAngle());
writeC(buf, playerAppearance.getBrowShape());
writeC(buf, playerAppearance.getNose());
writeC(buf, playerAppearance.getNoseBridge());
writeC(buf, playerAppearance.getNoseWidth());
writeC(buf, playerAppearance.getNoseTip());
writeC(buf, playerAppearance.getCheek());
writeC(buf, playerAppearance.getLipHeight());
writeC(buf, playerAppearance.getMouthSize());
writeC(buf, playerAppearance.getLipSize());
writeC(buf, playerAppearance.getSmile());
writeC(buf, playerAppearance.getLipShape());
writeC(buf, playerAppearance.getJawHeigh());
writeC(buf, playerAppearance.getChinJut());
writeC(buf, playerAppearance.getEarShape());
writeC(buf, playerAppearance.getHeadSize());
// 1.5.x 0x00, shoulderSize, armLength, legLength (BYTE) after HeadSize
writeC(buf, playerAppearance.getNeck());
writeC(buf, playerAppearance.getNeckLength());
writeC(buf, playerAppearance.getShoulderSize()); // shoulderSize
writeC(buf, playerAppearance.getTorso());
writeC(buf, playerAppearance.getChest());
writeC(buf, playerAppearance.getWaist());
writeC(buf, playerAppearance.getHips());
writeC(buf, playerAppearance.getArmThickness());
writeC(buf, playerAppearance.getHandSize());
writeC(buf, playerAppearance.getLegThicnkess());
writeC(buf, playerAppearance.getFootSize());
writeC(buf, playerAppearance.getFacialRate());
writeC(buf, 0x00); // 0x00
writeC(buf, playerAppearance.getArmLength()); // armLength
writeC(buf, playerAppearance.getLegLength()); // legLength
writeC(buf, playerAppearance.getShoulders());
writeC(buf, 0x00); // always 0 may be acessLevel
writeC(buf, 0x00); // always 0 - unk
writeF(buf, playerAppearance.getHeight());
int raceSex = 100000 + raceId * 2 + genderId;
writeD(buf, raceSex);
writeD(buf, pbd.getPosition().getMapId());//mapid for preloading map
writeF(buf, pbd.getPosition().getX());
writeF(buf, pbd.getPosition().getY());
writeF(buf, pbd.getPosition().getZ());
writeD(buf, pbd.getPosition().getHeading());
writeD(buf, pbd.getLevel());// lvl confirmed
writeD(buf, pbd.getTitleId());
writeD(buf, accPlData.isLegionMember() ? accPlData.getLegion().getLegionId() : 0);
writeD(buf, 0);// Legion Name WriteS NOT writeD
writeD(buf, 0);// unk 1 can be 0
writeD(buf, 0);// unk 25118405 elyos : 25642769
writeD(buf, 0);// unk 1
writeD(buf, 0);// unk 0
writeD(buf, 0);// unk 2 can be 0
writeD(buf, 0);// unk 0
writeD(buf, 0);// unk 0
writeD(buf, 0);// unk 1242826833
writeD(buf, 0);// unk 0
writeD(buf, 0);// unk 0
writeD(buf, 0);// unk 0
writeD(buf, 0);// unk 73138176
writeD(buf, 0);// unk 0
writeD(buf, 0);// unk 73182320
writeD(buf, 0);// unk 0
writeD(buf, 0);// unk 50379392
writeD(buf, 0);// unk 1242638636
int itemsDataSize = 0;
//TODO figure out this part when fully equipped
List<Item> items = accPlData.getEquipment().getEquippedItemsWithoutStigma();
for(Item item : items) {
if(itemsDataSize < 208 && item.getItemTemplate().getItemSlot() <= ItemSlot.PANTS.getSlotIdMask())
{
writeC(buf, 1); // this flas is needed to show equipment on selection screen
writeD(buf, item.getItemTemplate().getTemplateId());
GodStone godStone = item.getGodStone();
writeD(buf, godStone != null ? godStone.getItemId() : 0);
writeD(buf, item.getItemColor());
itemsDataSize += 13;
}
}
stupidNc = new byte[208-itemsDataSize];
writeB(buf, stupidNc);
writeD(buf, accPlData.getDeletionTimeInSeconds());
writeD(buf, 0x00);// unk
}
}