/*
* 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 3 of the License, 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, see <http://www.gnu.org/licenses/>.
*/
package net.sf.l2j.gameserver.network.serverpackets;
import net.sf.l2j.Config;
import net.sf.l2j.gameserver.datatables.NpcTable;
import net.sf.l2j.gameserver.instancemanager.CursedWeaponsManager;
import net.sf.l2j.gameserver.model.Location;
import net.sf.l2j.gameserver.model.actor.instance.L2PcInstance;
import net.sf.l2j.gameserver.model.itemcontainer.Inventory;
import net.sf.l2j.gameserver.skills.AbnormalEffect;
public class CharInfo extends L2GameServerPacket
{
private final L2PcInstance _activeChar;
private final Inventory _inv;
private final int _x, _y, _z, _heading;
private final int _mAtkSpd, _pAtkSpd;
private final int _runSpd, _walkSpd;
private final float _moveMultiplier;
public CharInfo(L2PcInstance cha)
{
_activeChar = cha;
_inv = _activeChar.getInventory();
_x = _activeChar.getX();
_y = _activeChar.getY();
_z = _activeChar.getZ();
_heading = _activeChar.getHeading();
_mAtkSpd = _activeChar.getMAtkSpd();
_pAtkSpd = _activeChar.getPAtkSpd();
_moveMultiplier = _activeChar.getMovementSpeedMultiplier();
_runSpd = (int) (_activeChar.getRunSpeed() / _moveMultiplier);
_walkSpd = (int) (_activeChar.getWalkSpeed() / _moveMultiplier);
}
@Override
protected final void writeImpl()
{
boolean gmSeeInvis = false;
if (_activeChar.getAppearance().getInvisible())
{
L2PcInstance tmp = getClient().getActiveChar();
if (tmp != null && tmp.isGM())
gmSeeInvis = true;
}
writeC(0x03);
writeD(_x);
writeD(_y);
writeD(_z);
writeD(_heading);
writeD(_activeChar.getObjectId());
writeS(_activeChar.getName());
writeD(_activeChar.getRace().ordinal());
writeD(_activeChar.getAppearance().getSex() ? 1 : 0);
if (_activeChar.getClassIndex() == 0)
writeD(_activeChar.getClassId().getId());
else
writeD(_activeChar.getBaseClass());
writeD(_inv.getPaperdollItemId(Inventory.PAPERDOLL_HAIRALL));
writeD(_inv.getPaperdollItemId(Inventory.PAPERDOLL_HEAD));
writeD(_inv.getPaperdollItemId(Inventory.PAPERDOLL_RHAND));
writeD(_inv.getPaperdollItemId(Inventory.PAPERDOLL_LHAND));
writeD(_inv.getPaperdollItemId(Inventory.PAPERDOLL_GLOVES));
writeD(_inv.getPaperdollItemId(Inventory.PAPERDOLL_CHEST));
writeD(_inv.getPaperdollItemId(Inventory.PAPERDOLL_LEGS));
writeD(_inv.getPaperdollItemId(Inventory.PAPERDOLL_FEET));
writeD(_inv.getPaperdollItemId(Inventory.PAPERDOLL_BACK));
writeD(_inv.getPaperdollItemId(Inventory.PAPERDOLL_RHAND));
writeD(_inv.getPaperdollItemId(Inventory.PAPERDOLL_HAIR));
writeD(_inv.getPaperdollItemId(Inventory.PAPERDOLL_FACE));
// c6 new h's
writeH(0x00);
writeH(0x00);
writeH(0x00);
writeH(0x00);
writeD(_inv.getPaperdollAugmentationId(Inventory.PAPERDOLL_RHAND));
writeH(0x00);
writeH(0x00);
writeH(0x00);
writeH(0x00);
writeH(0x00);
writeH(0x00);
writeH(0x00);
writeH(0x00);
writeH(0x00);
writeH(0x00);
writeH(0x00);
writeH(0x00);
writeD(_inv.getPaperdollAugmentationId(Inventory.PAPERDOLL_LHAND));
writeH(0x00);
writeH(0x00);
writeH(0x00);
writeH(0x00);
writeD(_activeChar.getPvpFlag());
writeD(_activeChar.getKarma());
writeD(_mAtkSpd);
writeD(_pAtkSpd);
writeD(_activeChar.getPvpFlag());
writeD(_activeChar.getKarma());
writeD(_runSpd);
writeD(_walkSpd);
writeD(_runSpd); // swim run speed
writeD(_walkSpd); // swim walk speed
writeD(_runSpd); // fl run speed
writeD(_walkSpd); // fl walk speed
writeD(_runSpd); // fly run speed
writeD(_walkSpd); // fly walk speed
writeF(_activeChar.getMovementSpeedMultiplier());
writeF(_activeChar.getAttackSpeedMultiplier());
if (_activeChar.getMountType() != 0)
{
writeF(NpcTable.getInstance().getTemplate(_activeChar.getMountNpcId()).getCollisionRadius());
writeF(NpcTable.getInstance().getTemplate(_activeChar.getMountNpcId()).getCollisionHeight());
}
else
{
writeF(_activeChar.getBaseTemplate().getCollisionRadius());
writeF(_activeChar.getBaseTemplate().getCollisionHeight());
}
writeD(_activeChar.getAppearance().getHairStyle());
writeD(_activeChar.getAppearance().getHairColor());
writeD(_activeChar.getAppearance().getFace());
if (gmSeeInvis)
writeS("Invisible");
else
writeS(_activeChar.getTitle());
writeD(_activeChar.getClanId());
writeD(_activeChar.getClanCrestId());
writeD(_activeChar.getAllyId());
writeD(_activeChar.getAllyCrestId());
writeD(0);
writeC(_activeChar.isSitting() ? 0 : 1); // standing = 1 sitting = 0
writeC(_activeChar.isRunning() ? 1 : 0); // running = 1 walking = 0
writeC(_activeChar.isInCombat() ? 1 : 0);
writeC(_activeChar.isAlikeDead() ? 1 : 0);
if (gmSeeInvis)
writeC(0);
else
writeC(_activeChar.getAppearance().getInvisible() ? 1 : 0); // invisible = 1 visible =0
writeC(_activeChar.getMountType()); // 1 on strider 2 on wyvern 0 no mount
writeC(_activeChar.getPrivateStoreType()); // 1 - sellshop
writeH(_activeChar.getCubics().size());
for (int id : _activeChar.getCubics().keySet())
writeH(id);
writeC(_activeChar.isInPartyMatchRoom() ? 1 : 0);
if (gmSeeInvis)
writeD((_activeChar.getAbnormalEffect() | AbnormalEffect.STEALTH.getMask()));
else
writeD(_activeChar.getAbnormalEffect());
writeC(_activeChar.getRecomLeft());
writeH(_activeChar.getRecomHave()); // Blue value for name (0 = white, 255 = pure blue)
writeD(_activeChar.getClassId().getId());
writeD(_activeChar.getMaxCp());
writeD((int) _activeChar.getCurrentCp());
writeC(_activeChar.isMounted() ? 0 : _activeChar.getEnchantEffect());
if (_activeChar.getTeam() == 1)
writeC(0x01); // team circle around feet 1= Blue, 2 = red
else if (_activeChar.getTeam() == 2)
writeC(0x02); // team circle around feet 1= Blue, 2 = red
else
writeC(0x00); // team circle around feet 1= Blue, 2 = red
writeD(_activeChar.getClanCrestLargeId());
writeC(_activeChar.isNoble() ? 1 : 0); // Symbol on char menu ctrl+I
writeC((_activeChar.isHero() || (_activeChar.isGM() && Config.GM_HERO_AURA)) ? 1 : 0); // Hero Aura
writeC(_activeChar.isFishing() ? 1 : 0); // 0x01: Fishing Mode (Cant be undone by setting back to 0)
Location loc = _activeChar.getFishingLoc();
if (loc != null)
{
writeD(loc.getX());
writeD(loc.getY());
writeD(loc.getZ());
}
else
{
writeD(0);
writeD(0);
writeD(0);
}
writeD(_activeChar.getAppearance().getNameColor());
writeD(0x00); // isRunning() as in UserInfo?
writeD(_activeChar.getPledgeClass());
writeD(_activeChar.getPledgeType());
writeD(_activeChar.getAppearance().getTitleColor());
if (_activeChar.isCursedWeaponEquipped())
writeD(CursedWeaponsManager.getInstance().getCurrentStage(_activeChar.getCursedWeaponEquippedId()) - 1);
else
writeD(0x00);
}
}
/*
* 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 3 of the License, 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, see <http://www.gnu.org/licenses/>.
*/
package net.sf.l2j.gameserver.network.serverpackets;
import net.sf.l2j.Config;
import net.sf.l2j.gameserver.datatables.NpcTable;
import net.sf.l2j.gameserver.instancemanager.CursedWeaponsManager;
import net.sf.l2j.gameserver.model.Location;
import net.sf.l2j.gameserver.model.actor.L2Summon;
import net.sf.l2j.gameserver.model.actor.instance.L2PcInstance;
import net.sf.l2j.gameserver.model.itemcontainer.Inventory;
import net.sf.l2j.gameserver.skills.AbnormalEffect;
import net.sf.l2j.gameserver.templates.chars.L2NpcTemplate;
public class UserInfo extends L2GameServerPacket
{
private final L2PcInstance _activeChar;
private final int _runSpd, _walkSpd;
private int _relation;
private final float _moveMultiplier;
public UserInfo(L2PcInstance character)
{
_activeChar = character;
_moveMultiplier = _activeChar.getMovementSpeedMultiplier();
_runSpd = (int) (_activeChar.getRunSpeed() / _moveMultiplier);
_walkSpd = (int) (_activeChar.getWalkSpeed() / _moveMultiplier);
_relation = _activeChar.isClanLeader() ? 0x40 : 0;
if (_activeChar.getSiegeState() == 1)
_relation |= 0x180;
if (_activeChar.getSiegeState() == 2)
_relation |= 0x80;
}
@Override
protected final void writeImpl()
{
writeC(0x04);
writeD(_activeChar.getX());
writeD(_activeChar.getY());
writeD(_activeChar.getZ());
writeD(_activeChar.getHeading());
writeD(_activeChar.getObjectId());
String name = _activeChar.getName();
if (_activeChar.getPoly().isMorphed())
{
L2NpcTemplate polyObj = NpcTable.getInstance().getTemplate(_activeChar.getPoly().getPolyId());
if (polyObj != null)
name = polyObj.getName();
}
writeS(name);
writeD(_activeChar.getRace().ordinal());
writeD(_activeChar.getAppearance().getSex() ? 1 : 0);
if (_activeChar.getClassIndex() == 0)
writeD(_activeChar.getClassId().getId());
else
writeD(_activeChar.getBaseClass());
writeD(_activeChar.getLevel());
writeQ(_activeChar.getExp());
writeD(_activeChar.getSTR());
writeD(_activeChar.getDEX());
writeD(_activeChar.getCON());
writeD(_activeChar.getINT());
writeD(_activeChar.getWIT());
writeD(_activeChar.getMEN());
writeD(_activeChar.getMaxHp());
writeD((int) _activeChar.getCurrentHp());
writeD(_activeChar.getMaxMp());
writeD((int) _activeChar.getCurrentMp());
writeD(_activeChar.getSp());
writeD(_activeChar.getCurrentLoad());
writeD(_activeChar.getMaxLoad());
writeD(_activeChar.getActiveWeaponItem() != null ? 40 : 20); // 20 no weapon, 40 weapon equipped
writeD(_activeChar.getInventory().getPaperdollObjectId(Inventory.PAPERDOLL_HAIRALL));
writeD(_activeChar.getInventory().getPaperdollObjectId(Inventory.PAPERDOLL_REAR));
writeD(_activeChar.getInventory().getPaperdollObjectId(Inventory.PAPERDOLL_LEAR));
writeD(_activeChar.getInventory().getPaperdollObjectId(Inventory.PAPERDOLL_NECK));
writeD(_activeChar.getInventory().getPaperdollObjectId(Inventory.PAPERDOLL_RFINGER));
writeD(_activeChar.getInventory().getPaperdollObjectId(Inventory.PAPERDOLL_LFINGER));
writeD(_activeChar.getInventory().getPaperdollObjectId(Inventory.PAPERDOLL_HEAD));
writeD(_activeChar.getInventory().getPaperdollObjectId(Inventory.PAPERDOLL_RHAND));
writeD(_activeChar.getInventory().getPaperdollObjectId(Inventory.PAPERDOLL_LHAND));
writeD(_activeChar.getInventory().getPaperdollObjectId(Inventory.PAPERDOLL_GLOVES));
writeD(_activeChar.getInventory().getPaperdollObjectId(Inventory.PAPERDOLL_CHEST));
writeD(_activeChar.getInventory().getPaperdollObjectId(Inventory.PAPERDOLL_LEGS));
writeD(_activeChar.getInventory().getPaperdollObjectId(Inventory.PAPERDOLL_FEET));
writeD(_activeChar.getInventory().getPaperdollObjectId(Inventory.PAPERDOLL_BACK));
writeD(_activeChar.getInventory().getPaperdollObjectId(Inventory.PAPERDOLL_RHAND));
writeD(_activeChar.getInventory().getPaperdollObjectId(Inventory.PAPERDOLL_HAIR));
writeD(_activeChar.getInventory().getPaperdollObjectId(Inventory.PAPERDOLL_FACE));
writeD(_activeChar.getInventory().getPaperdollItemId(Inventory.PAPERDOLL_HAIRALL));
writeD(_activeChar.getInventory().getPaperdollItemId(Inventory.PAPERDOLL_REAR));
writeD(_activeChar.getInventory().getPaperdollItemId(Inventory.PAPERDOLL_LEAR));
writeD(_activeChar.getInventory().getPaperdollItemId(Inventory.PAPERDOLL_NECK));
writeD(_activeChar.getInventory().getPaperdollItemId(Inventory.PAPERDOLL_RFINGER));
writeD(_activeChar.getInventory().getPaperdollItemId(Inventory.PAPERDOLL_LFINGER));
writeD(_activeChar.getInventory().getPaperdollItemId(Inventory.PAPERDOLL_HEAD));
writeD(_activeChar.getInventory().getPaperdollItemId(Inventory.PAPERDOLL_RHAND));
writeD(_activeChar.getInventory().getPaperdollItemId(Inventory.PAPERDOLL_LHAND));
writeD(_activeChar.getInventory().getPaperdollItemId(Inventory.PAPERDOLL_GLOVES));
writeD(_activeChar.getInventory().getPaperdollItemId(Inventory.PAPERDOLL_CHEST));
writeD(_activeChar.getInventory().getPaperdollItemId(Inventory.PAPERDOLL_LEGS));
writeD(_activeChar.getInventory().getPaperdollItemId(Inventory.PAPERDOLL_FEET));
writeD(_activeChar.getInventory().getPaperdollItemId(Inventory.PAPERDOLL_BACK));
writeD(_activeChar.getInventory().getPaperdollItemId(Inventory.PAPERDOLL_RHAND));
writeD(_activeChar.getInventory().getPaperdollItemId(Inventory.PAPERDOLL_HAIR));
writeD(_activeChar.getInventory().getPaperdollItemId(Inventory.PAPERDOLL_FACE));
// c6 new h's
writeH(0x00);
writeH(0x00);
writeH(0x00);
writeH(0x00);
writeH(0x00);
writeH(0x00);
writeH(0x00);
writeH(0x00);
writeH(0x00);
writeH(0x00);
writeH(0x00);
writeH(0x00);
writeH(0x00);
writeH(0x00);
writeD(_activeChar.getInventory().getPaperdollAugmentationId(Inventory.PAPERDOLL_RHAND));
writeH(0x00);
writeH(0x00);
writeH(0x00);
writeH(0x00);
writeH(0x00);
writeH(0x00);
writeH(0x00);
writeH(0x00);
writeH(0x00);
writeH(0x00);
writeH(0x00);
writeH(0x00);
writeD(_activeChar.getInventory().getPaperdollAugmentationId(Inventory.PAPERDOLL_LHAND));
writeH(0x00);
writeH(0x00);
writeH(0x00);
writeH(0x00);
// end of c6 new h's
writeD(_activeChar.getPAtk(null));
writeD(_activeChar.getPAtkSpd());
writeD(_activeChar.getPDef(null));
writeD(_activeChar.getEvasionRate(null));
writeD(_activeChar.getAccuracy());
writeD(_activeChar.getCriticalHit(null, null));
writeD(_activeChar.getMAtk(null, null));
writeD(_activeChar.getMAtkSpd());
writeD(_activeChar.getPAtkSpd());
writeD(_activeChar.getMDef(null, null));
writeD(_activeChar.getPvpFlag()); // 0-non-pvp 1-pvp = violett name
writeD(_activeChar.getKarma());
writeD(_runSpd);
writeD(_walkSpd);
writeD(_runSpd); // swim run speed
writeD(_walkSpd); // swim walk speed
writeD(0);
writeD(0);
writeD(_activeChar.isFlying() ? _runSpd : 0); // fly speed
writeD(_activeChar.isFlying() ? _walkSpd : 0); // fly speed
writeF(_moveMultiplier);
writeF(_activeChar.getAttackSpeedMultiplier());
L2Summon pet = _activeChar.getPet();
if (_activeChar.getMountType() != 0 && pet != null)
{
writeF(pet.getTemplate().getCollisionRadius());
writeF(pet.getTemplate().getCollisionHeight());
}
else
{
writeF(_activeChar.getBaseTemplate().getCollisionRadius());
writeF(_activeChar.getBaseTemplate().getCollisionHeight());
}
writeD(_activeChar.getAppearance().getHairStyle());
writeD(_activeChar.getAppearance().getHairColor());
writeD(_activeChar.getAppearance().getFace());
writeD(_activeChar.isGM() ? 1 : 0); // builder level
writeS(_activeChar.getPoly().isMorphed() ? "Morphed" : _activeChar.getTitle());
writeD(_activeChar.getClanId());
writeD(_activeChar.getClanCrestId());
writeD(_activeChar.getAllyId());
writeD(_activeChar.getAllyCrestId()); // ally crest id
// 0x40 leader rights
// siege flags: attacker - 0x180 sword over name, defender - 0x80 shield, 0xC0 crown (|leader), 0x1C0 flag (|leader)
writeD(_relation);
writeC(_activeChar.getMountType()); // mount type
writeC(_activeChar.getPrivateStoreType());
writeC(_activeChar.hasDwarvenCraft() ? 1 : 0);
writeD(_activeChar.getPkKills());
writeD(_activeChar.getPvpKills());
writeH(_activeChar.getCubics().size());
for (int id : _activeChar.getCubics().keySet())
writeH(id);
writeC(_activeChar.isInPartyMatchRoom() ? 1 : 0);
if (_activeChar.getAppearance().getInvisible() && _activeChar.isGM())
writeD(_activeChar.getAbnormalEffect() | AbnormalEffect.STEALTH.getMask());
else
writeD(_activeChar.getAbnormalEffect());
writeC(0x00);
writeD(_activeChar.getClanPrivileges());
writeH(_activeChar.getRecomLeft()); // c2 recommendations remaining
writeH(_activeChar.getRecomHave()); // c2 recommendations received
writeD(_activeChar.getMountNpcId() > 0 ? _activeChar.getMountNpcId() + 1000000 : 0);
writeH(_activeChar.getInventoryLimit());
writeD(_activeChar.getClassId().getId());
writeD(0x00); // special effects? circles around player...
writeD(_activeChar.getMaxCp());
writeD((int) _activeChar.getCurrentCp());
writeC(_activeChar.isMounted() ? 0 : _activeChar.getEnchantEffect());
if (_activeChar.getTeam() == 1)
writeC(0x01); // team circle around feet 1= Blue, 2 = red
else if (_activeChar.getTeam() == 2)
writeC(0x02); // team circle around feet 1= Blue, 2 = red
else
writeC(0x00); // team circle around feet 1= Blue, 2 = red
writeD(_activeChar.getClanCrestLargeId());
writeC(_activeChar.isNoble() ? 1 : 0); // 0x01: symbol on char menu ctrl+I
writeC(_activeChar.isHero() || (_activeChar.isGM() && Config.GM_HERO_AURA) ? 1 : 0); // 0x01: Hero Aura
writeC(_activeChar.isFishing() ? 1 : 0); // Fishing Mode
Location loc = _activeChar.getFishingLoc();
if (loc != null)
{
writeD(loc.getX());
writeD(loc.getY());
writeD(loc.getZ());
}
else
{
writeD(0);
writeD(0);
writeD(0);
}
writeD(_activeChar.getAppearance().getNameColor());
// new c5
writeC(_activeChar.isRunning() ? 0x01 : 0x00); // changes the Speed display on Status Window
writeD(_activeChar.getPledgeClass()); // changes the text above CP on Status Window
writeD(_activeChar.getPledgeType());
writeD(_activeChar.getAppearance().getTitleColor());
if (_activeChar.isCursedWeaponEquipped())
writeD(CursedWeaponsManager.getInstance().getCurrentStage(_activeChar.getCursedWeaponEquippedId()) - 1);
else
writeD(0x00);
}
}