/*
* Copyright (C) 2004-2014 L2J Server
*
* This file is part of L2J Server.
*
* L2J Server 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.
*
* L2J Server 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 com.l2jserver.gameserver.network.serverpackets;
import com.l2jserver.Config;
import com.l2jserver.gameserver.datatables.ExperienceTable;
import com.l2jserver.gameserver.datatables.NpcData;
import com.l2jserver.gameserver.instancemanager.CursedWeaponsManager;
import com.l2jserver.gameserver.instancemanager.TerritoryWarManager;
import com.l2jserver.gameserver.model.Elementals;
import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
import com.l2jserver.gameserver.model.actor.templates.L2NpcTemplate;
import com.l2jserver.gameserver.model.skills.AbnormalVisualEffect;
import com.l2jserver.gameserver.model.items.L2Weapon; // 603
import com.l2jserver.gameserver.model.items.type.WeaponType; // 603
import com.l2jserver.gameserver.model.zone.ZoneId;
import com.l2jserver.gameserver.datatables.MessageTable;
public final class UserInfo extends L2GameServerPacket
{
private final L2PcInstance _activeChar;
private int _relation;
private int _airShipHelm;
private int data_name_Err = 0; // 603-TEST
private byte[] data_name; // 603-TEST
private int data_title_Err = 0; // 603-TEST
private byte[] data_title; // 603-TEST
private final int _runSpd, _walkSpd;
private final int _swimRunSpd, _swimWalkSpd;
private final int _flyRunSpd, _flyWalkSpd;
private final double _moveMultiplier;
private long _user_userinfo[] = new long[87]; // 603 : GS-comment-051
private String _user_username[] = new String[2]; // 603 : GS-comment-051
private double _user_userspeed[] = new double[4]; // 603 : GS-comment-051
public UserInfo(L2PcInstance cha)
{
_activeChar = cha;
int _territoryId = TerritoryWarManager.getInstance().getRegisteredTerritoryId(cha);
_relation = _activeChar.isClanLeader() ? 0x40 : 0;
if (_activeChar.getSiegeState() == 1)
{
if (_territoryId == 0)
{
_relation |= 0x180;
}
else
{
_relation |= 0x1000;
}
}
if (_activeChar.getSiegeState() == 2)
{
_relation |= 0x80;
}
// _isDisguised = TerritoryWarManager.getInstance().isDisguised(character.getObjectId());
if (_activeChar.isInAirShip() && _activeChar.getAirShip().isCaptain(_activeChar))
{
_airShipHelm = _activeChar.getAirShip().getHelmItemId();
}
else
{
_airShipHelm = 0;
}
_moveMultiplier = cha.getMovementSpeedMultiplier();
_runSpd = (int) Math.round(cha.getRunSpeed() / _moveMultiplier);
_walkSpd = (int) Math.round(cha.getWalkSpeed() / _moveMultiplier);
_swimRunSpd = (int) Math.round(cha.getSwimRunSpeed() / _moveMultiplier);
_swimWalkSpd = (int) Math.round(cha.getSwimWalkSpeed() / _moveMultiplier);
_flyRunSpd = cha.isFlying() ? _runSpd : 0;
_flyWalkSpd = cha.isFlying() ? _walkSpd : 0;
_activeChar.sendPacket(new ExSubjobInfo(_activeChar)); // 603
}
@Override
protected final void writeImpl()
{
String user_name = _activeChar.getAppearance().getVisibleName();
int len_user_name = _activeChar.getAppearance().getVisibleName().length();
if (len_user_name > 0)
{
try
{
data_name = user_name.getBytes("UTF-16LE");
}
catch (Exception e)
{
data_name_Err = 2;
}
}
String title = _activeChar.getTitle();
if (_activeChar.isInvisible())
{
title = MessageTable.Messages[228].getMessage();
}
if (_activeChar.getPoly().isMorphed())
{
final L2NpcTemplate polyObj = NpcData.getInstance().getTemplate(_activeChar.getPoly().getPolyId());
if (polyObj != null)
{
title += " (" + _activeChar.getPoly().getPolyId() + " " + polyObj.getName() + ")";
}
}
int len_user_title = title.length();
if (len_user_title > 0)
{
try
{
data_title = title.getBytes("UTF-16LE");
}
catch (Exception e)
{
data_title_Err = 2;
}
}
// 603 : GS-comment-051 start
_user_username[0] = _activeChar.getAppearance().getVisibleName();
_user_username[1] = title;
_user_userinfo[0] = System.currentTimeMillis();
_user_userinfo[1] = (long) _relation;
_user_userinfo[2] = (long) (_activeChar.isGM() ? 1 : 0);
_user_userinfo[3] = (long) _activeChar.getRace().ordinal();
_user_userinfo[4] = (long) (_activeChar.getAppearance().getSex() ? 1 : 0);
_user_userinfo[5] = (long) _activeChar.getBaseClass();
_user_userinfo[6] = (long) _activeChar.getClassId().getId();
_user_userinfo[7] = (long) _activeChar.getLevel();
_user_userinfo[8] = (long) _activeChar.getSTR();
_user_userinfo[9] = (long) _activeChar.getDEX();
_user_userinfo[10] = (long) _activeChar.getCON();
_user_userinfo[11] = (long) _activeChar.getINT();
_user_userinfo[12] = (long) _activeChar.getWIT();
_user_userinfo[13] = (long) _activeChar.getMEN();
_user_userinfo[14] = (long) _activeChar.getMaxHp();
_user_userinfo[15] = (long) _activeChar.getMaxMp();
_user_userinfo[16] = (long) _activeChar.getMaxCp();
_user_userinfo[17] = (long) Math.round(_activeChar.getCurrentHp());
_user_userinfo[18] = (long) Math.round(_activeChar.getCurrentMp());
_user_userinfo[19] = (long) _activeChar.getCurrentCp();
_user_userinfo[20] = (long) _activeChar.getSp();
_user_userinfo[21] = (long) _activeChar.getExp();
_user_userinfo[22] = (long) (_activeChar.isMounted() || (_airShipHelm != 0) ? 0 : _activeChar.getEnchantEffect());
_user_userinfo[23] = (long) _activeChar.getAppearance().getHairStyle();
_user_userinfo[24] = (long) _activeChar.getAppearance().getHairColor();
_user_userinfo[25] = (long) _activeChar.getAppearance().getFace();
_user_userinfo[26] = (long) _activeChar.getPrivateStoreType().getId();
_user_userinfo[27] = (long) (_activeChar.hasDwarvenCraft() || _activeChar.isAwaken()? 1 : 0);
if (_activeChar.getActiveWeaponItem() != null)
{
L2Weapon weaponItem = _activeChar.getActiveWeaponItem();
if (weaponItem.getItemType() == WeaponType.POLE)
_user_userinfo[28] = 80;
else if (weaponItem.getItemType() == WeaponType.BOW)
_user_userinfo[28] = 500;
else if (weaponItem.getItemType() == WeaponType.CROSSBOW)
_user_userinfo[28] = 400;
else
_user_userinfo[28] = 40;
}
else
_user_userinfo[28] = 0;
_user_userinfo[29] = (long) _activeChar.getPAtk(null);
_user_userinfo[30] = (long) _activeChar.getPAtkSpd();
_user_userinfo[31] = (long) _activeChar.getPDef(null);
_user_userinfo[32] = (long) _activeChar.getEvasionRate(null);
_user_userinfo[33] = (long) _activeChar.getAccuracy();
_user_userinfo[34] = (long) _activeChar.getCriticalHit(null, null);
_user_userinfo[35] = (long) _activeChar.getMAtk(null, null);
_user_userinfo[36] = (long) _activeChar.getMAtkSpd();
_user_userinfo[37] = (long) _activeChar.getMDef(null, null);
_user_userinfo[38] = (long) _activeChar.getMCriticalHit(null, null);
_user_userinfo[39] = (long) _activeChar.getDefenseElementValue(Elementals.FIRE);
_user_userinfo[40] = (long) _activeChar.getDefenseElementValue(Elementals.WATER);
_user_userinfo[41] = (long) _activeChar.getDefenseElementValue(Elementals.WIND);
_user_userinfo[42] = (long) _activeChar.getDefenseElementValue(Elementals.EARTH);
_user_userinfo[43] = (long) _activeChar.getDefenseElementValue(Elementals.HOLY);
_user_userinfo[44] = (long) _activeChar.getDefenseElementValue(Elementals.DARK);
_user_userinfo[45] = (long) _activeChar.getX();
_user_userinfo[46] = (long) _activeChar.getY();
_user_userinfo[47] = (long) _activeChar.getZ();
_user_userinfo[48] = (long) (_activeChar.getVehicle() != null ? _activeChar.getVehicle().getObjectId() : 0);
_user_userinfo[49] = (long) _runSpd;
_user_userinfo[50] = (long) _walkSpd;
_user_userinfo[51] = (long) _swimRunSpd;
_user_userinfo[52] = (long) _swimWalkSpd;
_user_userinfo[53] = (long) _flyRunSpd;
_user_userinfo[54] = (long) _flyWalkSpd;
_user_userinfo[55] = (long) _flyRunSpd;
_user_userinfo[56] = (long) _flyWalkSpd;
_user_userspeed[0] = _moveMultiplier;
_user_userspeed[1] = _activeChar.getAttackSpeedMultiplier();
_user_userspeed[2] = _activeChar.getCollisionRadius();
_user_userspeed[3] = _activeChar.getCollisionHeight();
_user_userinfo[57] = (long) _activeChar.getAttackElement();
byte _attackAttribute = _activeChar.getAttackElement();
_user_userinfo[58] = (long) _activeChar.getAttackElementValue(_attackAttribute);
_user_userinfo[59] = (long) _activeChar.getPledgeType();
_user_userinfo[60] = (long) _activeChar.getClanId();
_user_userinfo[61] = (long) _activeChar.getClanCrestLargeId();
_user_userinfo[62] = (long) _activeChar.getClanCrestId();
_user_userinfo[63] = (long) _activeChar.getClanPrivileges().getBitmask();
_user_userinfo[64] = (long) (_activeChar.isClanLeader() ? 1 : 0);
_user_userinfo[65] = (long) _activeChar.getAllyId();
_user_userinfo[66] = (long) _activeChar.getAllyCrestId();
_user_userinfo[67] = (long) (_activeChar.isInPartyMatchRoom() ? 1 : 0);
_user_userinfo[68] = (long) _activeChar.getPvpFlag();
_user_userinfo[69] = (long) _activeChar.getKarma();
_user_userinfo[70] = (long) (_activeChar.isNoble() ? 1 : 0);
_user_userinfo[71] = (long) (_activeChar.isHero() || (_activeChar.isGM() && Config.GM_HERO_AURA) ? 1 : 0);
_user_userinfo[72] = (long) _activeChar.getPledgeClass();
_user_userinfo[73] = (long) _activeChar.getPkKills();
_user_userinfo[74] = (long) _activeChar.getPvpKills();
_user_userinfo[75] = (long) _activeChar.getRecomLeft();
_user_userinfo[76] = (long) _activeChar.getRecomHave();
_user_userinfo[77] = (long) _activeChar.getVitalityPoints();
_user_userinfo[78] = (long) _activeChar.getFame();
_user_userinfo[79] = (long) _activeChar.getInventory().getTalismanSlots();
_user_userinfo[80] = (long) _activeChar.getTeam().getId();
_user_userinfo[81] = (long) (_activeChar.isInsideZone(ZoneId.WATER) ? 1 : _activeChar.isFlyingMounted() ? 2 : 0);
_user_userinfo[82] = (long) (_activeChar.isRunning() ? 0x01 : 0x00);
_user_userinfo[83] = (long) _activeChar.getAppearance().getNameColor();
_user_userinfo[84] = (long) _activeChar.getAppearance().getTitleColor();
_user_userinfo[85] = (long) _activeChar.getInventoryLimit();
_user_userinfo[86] = (long) (_activeChar.isCursedWeaponEquipped() ? CursedWeaponsManager.getInstance().getLevel(_activeChar.getCursedWeaponEquippedId()) : 0);
if ((System.currentTimeMillis() - _activeChar.getUserEquipSlot(0)) > 60000)
{
for (int i = 0; i < 87; i++)
{
_activeChar.setUserUserInfo(i, _user_userinfo[i]);
}
for (int n = 0; n < 2; n++)
{
_activeChar.setUserUserName(n, _user_username[n]);
}
for (int d = 0; d < 4; d++)
{
_activeChar.setUserUserSpeed(d, _user_userspeed[d]);
}
}
else
{
int _needUpdate = 0;
for (int i = 1; i < 87; i++)
{
if (_user_userinfo[i] != _activeChar.getUserUserInfo(i))
{
_needUpdate = 1;
}
}
for (int n = 0; n < 2; n++)
{
if (_user_username[n] != _activeChar.getUserUserName(n))
{
_needUpdate = 1;
}
}
for (int d = 0; d < 4; d++)
{
if (_user_userspeed[d] != _activeChar.getUserUserSpeed(d))
{
_needUpdate = 1;
}
}
if (_needUpdate == 0)
{
return;
}
else
{
for (int i = 0; i < 87; i++)
{
_activeChar.setUserUserInfo(i, _user_userinfo[i]);
}
for (int n = 0; n < 2; n++)
{
_activeChar.setUserUserName(n, _user_username[n]);
}
for (int d = 0; d < 4; d++)
{
_activeChar.setUserUserSpeed(d, _user_userspeed[d]);
}
}
}
// 603 : GS-comment-051 end
writeC(0x32);
writeD(_activeChar.getObjectId());
writeD(377 + len_user_name*2 + data_name_Err + len_user_title*2 + data_title_Err);
writeH(23);
writeH(65535);
writeC(254);
// 0x40 leader rights
// siege flags: attacker - 0x180 sword over name, defender - 0x80 shield, 0xC0 crown (|leader), 0x1C0 flag (|leader)
writeH(_relation); // 603
writeH(0);
/////////////////////////////////////////////////////////////////
writeH(16 + len_user_name*2 + data_name_Err); // 603-1
writeH(len_user_name + data_name_Err/2); // 603-1
if (len_user_name > 0)
{
if (data_name_Err == 0)
writeB(data_name);
else
writeS(_activeChar.getAppearance().getVisibleName());
}
writeC(_activeChar.isGM() ? 1 : 0);
writeC(_activeChar.getRace().ordinal());
writeC(_activeChar.getAppearance().getSex() ? 1 : 0);
writeD(_activeChar.getBaseClass());
writeD(_activeChar.getClassId().getId());
writeC(_activeChar.getLevel());
/////////////////////////////////////////////////////////////////
writeH(18); // 603-2
writeH(_activeChar.getSTR());
writeH(_activeChar.getDEX());
writeH(_activeChar.getCON());
writeH(_activeChar.getINT());
writeH(_activeChar.getWIT());
writeH(_activeChar.getMEN());
writeH(0); // 603-New-1-LUC
writeH(0); // 603-New-2-CHA
/////////////////////////////////////////////////////////////////
writeH(14); // 603-3
writeD(_activeChar.getMaxHp());
writeD(_activeChar.getMaxMp());
writeD(_activeChar.getMaxCp());
/////////////////////////////////////////////////////////////////
writeH(38); // 603-4
writeD((int) Math.round(_activeChar.getCurrentHp()));
writeD((int) Math.round(_activeChar.getCurrentMp()));
writeD((int) _activeChar.getCurrentCp());
writeQ(_activeChar.getSp());
writeQ(_activeChar.getExp());
writeF((float) (_activeChar.getExp() - ExperienceTable.getInstance().getExpForLevel(_activeChar.getLevel())) / (ExperienceTable.getInstance().getExpForLevel(_activeChar.getLevel() + 1) - ExperienceTable.getInstance().getExpForLevel(_activeChar.getLevel()))); // High Five exp %
/////////////////////////////////////////////////////////////////
writeH(4); // 603-5
writeC(_activeChar.isMounted() || (_airShipHelm != 0) ? 0 : _activeChar.getEnchantEffect());
writeC(0);
/////////////////////////////////////////////////////////////////
writeH(15); // 603-6
writeD(_activeChar.getAppearance().getHairStyle());
writeD(_activeChar.getAppearance().getHairColor());
writeD(_activeChar.getAppearance().getFace());
writeC(1);
/////////////////////////////////////////////////////////////////
writeH(6); // 603-7
writeC(0);
writeC(_activeChar.getPrivateStoreType().getId());
writeC(_activeChar.hasDwarvenCraft() || _activeChar.isAwaken()? 1 : 0);
writeC(0); // 603
/////////////////////////////////////////////////////////////////
writeH(56); // 603-8
if (_activeChar.getActiveWeaponItem() != null)
{
L2Weapon weaponItem = _activeChar.getActiveWeaponItem();
if (weaponItem.getItemType() == WeaponType.POLE)
writeH(80);
else if (weaponItem.getItemType() == WeaponType.BOW)
writeH(500);
else if (weaponItem.getItemType() == WeaponType.CROSSBOW)
writeH(400);
else
writeH(40);
}
else
writeH(0);
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.getEvasionRate(null)); //Magic
writeD(_activeChar.getMDef(null, null));
writeD(_activeChar.getAccuracy()); //Magic
writeD(_activeChar.getMCriticalHit(null, null)); //Magic
/////////////////////////////////////////////////////////////////
writeH(14); // 603-9
writeH(_activeChar.getDefenseElementValue(Elementals.FIRE));
writeH(_activeChar.getDefenseElementValue(Elementals.WATER));
writeH(_activeChar.getDefenseElementValue(Elementals.WIND));
writeH(_activeChar.getDefenseElementValue(Elementals.EARTH));
writeH(_activeChar.getDefenseElementValue(Elementals.HOLY));
writeH(_activeChar.getDefenseElementValue(Elementals.DARK));
/////////////////////////////////////////////////////////////////
writeH(18); // 603-10
writeD(_activeChar.getX());
writeD(_activeChar.getY());
writeD(_activeChar.getZ());
writeD(_activeChar.getVehicle() != null ? _activeChar.getVehicle().getObjectId() : 0);
/////////////////////////////////////////////////////////////////
writeH(18); // 603-11
writeH(_runSpd);
writeH(_walkSpd);
writeH(_swimRunSpd);
writeH(_swimWalkSpd);
writeH(_flyRunSpd);
writeH(_flyWalkSpd);
writeH(_flyRunSpd);
writeH(_flyWalkSpd);
/////////////////////////////////////////////////////////////////
writeH(18); // 603-12
writeF(_moveMultiplier);
writeF(_activeChar.getAttackSpeedMultiplier());
/////////////////////////////////////////////////////////////////
writeH(18); // 603-13
writeF(_activeChar.getCollisionRadius());
writeF(_activeChar.getCollisionHeight());
/////////////////////////////////////////////////////////////////
writeH(5); // 603-14
byte attackAttribute = _activeChar.getAttackElement();
writeC(attackAttribute);
writeH(_activeChar.getAttackElementValue(attackAttribute));
/////////////////////////////////////////////////////////////////
writeH(32 + len_user_title*2 + data_title_Err); // 603-15
writeH(len_user_title + data_title_Err/2);
if (len_user_title > 0)
{
if (data_title_Err == 0)
writeB(data_title);
else
writeS(title);
}
writeH(_activeChar.getPledgeType());
writeD(_activeChar.getClanId());
writeD(_activeChar.getClanCrestLargeId());
writeD(_activeChar.getClanCrestId());
writeC(_activeChar.getClanPrivileges().getBitmask());
writeH(0);
writeC(0);
writeC(_activeChar.isClanLeader() ? 1 : 0);
writeD(_activeChar.getAllyId());
writeD(_activeChar.getAllyCrestId());
writeC(_activeChar.isInPartyMatchRoom() ? 1 : 0);
/////////////////////////////////////////////////////////////////
writeH(22); // 603-16
writeC(_activeChar.getPvpFlag());
int Karma = 0 - _activeChar.getKarma();
writeD(Karma);
writeC(_activeChar.isNoble() ? 1 : 0);
writeC(_activeChar.isHero() || (_activeChar.isGM() && Config.GM_HERO_AURA) ? 1 : 0);
writeC(_activeChar.getPledgeClass());
writeD(_activeChar.getPkKills());
writeD(_activeChar.getPvpKills());
writeH(_activeChar.getRecomLeft());
writeH(_activeChar.getRecomHave());
/////////////////////////////////////////////////////////////////
writeH(15); // 603-17
writeD(_activeChar.getVitalityPoints());
writeC(0);
writeD(_activeChar.getFame());
writeD(0);
/////////////////////////////////////////////////////////////////
writeH(9); // 603-18
writeC(_activeChar.getInventory().getTalismanSlots());
writeC(0);
writeC(_activeChar.getTeam().getId());
writeC(0);
writeC(0);
writeC(0);
writeC(0);
/////////////////////////////////////////////////////////////////
writeH(4); // 603-19
writeC(_activeChar.isInsideZone(ZoneId.WATER) ? 1 : _activeChar.isFlyingMounted() ? 2 : 0);
writeC(_activeChar.isRunning() ? 0x01 : 0x00);
/////////////////////////////////////////////////////////////////
writeH(10); // 603-20
writeD(_activeChar.getAppearance().getNameColor());
writeD(_activeChar.getAppearance().getTitleColor());
/////////////////////////////////////////////////////////////////
writeH(9); // 603-21
writeD(0);
writeH(_activeChar.getInventoryLimit());
writeC(_activeChar.isCursedWeaponEquipped() ? CursedWeaponsManager.getInstance().getLevel(_activeChar.getCursedWeaponEquippedId()) : 0);
/////////////////////////////////////////////////////////////////
writeH(9); // 603-22
writeD(1);
writeH(0);
writeC(0);
/////////////////////////////////////////////////////////////////
// in old UserInfo, but not in new UserInfo
//writeD(_activeChar.getMountNpcId() > 0 ? _activeChar.getMountNpcId() + 1000000 : 0);
//writeC(_activeChar.getMountType().ordinal()); // mount type// 1-on Strider, 2-on Wyvern, 3-on Great Wolf, 0-no mount
//writeD(_activeChar.isMinimapAllowed() ? 1 : 0); // Minimap on Hellbound
//writeC(_activeChar.getInventory().canEquipCloak() ? 1 : 0); // 603-not need
}
@Override
public void runImpl() // 603
{
getClient().sendPacket(new ExUserInfoEquipSlot(getClient().getActiveChar()));
getClient().sendPacket(new ExUserInfoCubic(getClient().getActiveChar()));
getClient().sendPacket(new ExUserInfoAbnormalVisualEffect(getClient().getActiveChar()));
}
}