Sync with L2JServer Jan 9th 2015.

This commit is contained in:
mobius
2015-01-09 19:55:02 +00:00
parent 9c9b0aaff7
commit 4c2db62a63
618 changed files with 19803 additions and 7853 deletions

View File

@ -36,6 +36,7 @@ public class AcquireSkillList extends L2GameServerPacket
public AcquireSkillList(L2PcInstance activeChar)
{
_learnable = SkillTreesData.getInstance().getAvailableSkills(activeChar, activeChar.getClassId(), false, false);
_learnable.addAll(SkillTreesData.getInstance().getNextAvailableSkills(activeChar, activeChar.getClassId(), false, false));
}
@Override
@ -49,7 +50,7 @@ public class AcquireSkillList extends L2GameServerPacket
writeH(skill.getSkillLevel());
writeQ(skill.getLevelUpSp());
writeC(skill.getGetLevel());
writeC(skill.getGetLevel()); // Dual Class Level Required
writeC(0x00); // Dual Class Level Required
writeC(skill.getRequiredItems().size());
for (ItemHolder item : skill.getRequiredItems())
{

View File

@ -90,6 +90,14 @@ public final class CreatureSay extends L2GameServerPacket
_text = text;
}
public CreatureSay(L2PcInstance player, int messageType, String text)
{
_objectId = player.getObjectId();
_textType = messageType;
_charName = player.getAppearance().getVisibleName();
_text = text;
}
public CreatureSay(int objectId, int messageType, int charId, NpcStringId npcString)
{
_objectId = objectId;

View File

@ -18,6 +18,7 @@
*/
package com.l2jserver.gameserver.network.serverpackets;
import com.l2jserver.gameserver.enums.CastleSide;
import com.l2jserver.gameserver.model.entity.Castle;
/**
@ -26,12 +27,12 @@ import com.l2jserver.gameserver.model.entity.Castle;
public class ExCastleState extends L2GameServerPacket
{
private final int _castleId;
private final int _state;
private final CastleSide _castleSide;
public ExCastleState(Castle castle)
{
_castleId = castle.getResidenceId();
_state = castle.getState();
_castleSide = castle.getSide();
}
@Override
@ -40,6 +41,6 @@ public class ExCastleState extends L2GameServerPacket
writeC(0xFE);
writeH(0x12D);
writeD(_castleId);
writeD(_state);
writeD(_castleSide.ordinal());
}
}

View File

@ -0,0 +1,41 @@
/*
* Copyright (C) 2004-2015 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;
/**
* @author Sdw
*/
public class ExChangeToAwakenedClass extends L2GameServerPacket
{
private final int _classId;
public ExChangeToAwakenedClass(int classId)
{
_classId = classId;
}
@Override
protected void writeImpl()
{
writeC(0xFE);
writeH(0xFF);
writeD(_classId);
}
}

View File

@ -18,28 +18,27 @@
*/
package com.l2jserver.gameserver.network.serverpackets;
import com.l2jserver.gameserver.datatables.CrestTable;
import com.l2jserver.gameserver.model.L2Crest;
import com.l2jserver.Config;
/**
* @author -Wooden-
* @author -Wooden-, Sdw
*/
public class ExPledgeCrestLarge extends L2GameServerPacket
public class ExPledgeEmblem extends L2GameServerPacket
{
private final int _crestId;
private final int _clanId;
private final byte[] _data;
private final int _chunkId;
private final int _chunkSize;
private static final int TOTAL_SIZE = 65664;
public ExPledgeCrestLarge(int crestId)
public ExPledgeEmblem(int crestId, byte[] chunkedData, int clanId, int chunkId, int chunkSize)
{
_crestId = crestId;
final L2Crest crest = CrestTable.getInstance().getCrest(crestId);
_data = crest != null ? crest.getData() : null;
}
public ExPledgeCrestLarge(int crestId, byte[] data)
{
_crestId = crestId;
_data = data;
_data = chunkedData;
_clanId = clanId;
_chunkId = chunkId;
_chunkSize = chunkSize;
}
@Override
@ -47,8 +46,12 @@ public class ExPledgeCrestLarge extends L2GameServerPacket
{
writeC(0xFE);
writeH(0x1B);
writeD(0x00);
writeD(Config.SERVER_ID);
writeD(_clanId);
writeD(_crestId);
writeD(_chunkId);
writeD(TOTAL_SIZE);
writeD(_chunkSize);
if (_data != null)
{
writeD(_data.length);

View File

@ -23,6 +23,8 @@ package com.l2jserver.gameserver.network.serverpackets;
*/
public class ExPledgeWaitingListAlarm extends L2GameServerPacket
{
public static final ExPledgeWaitingListAlarm STATIC_PACKET = new ExPledgeWaitingListAlarm();
@Override
protected void writeImpl()
{

View File

@ -63,7 +63,7 @@ public class ExSubjobInfo extends L2GameServerPacket
_index = sub.getClassIndex();
_classId = sub.getClassId();
_level = sub.getLevel();
_type = SubclassType.SUBCLASS.ordinal();
_type = sub.isDualClass() ? SubclassType.DUALCLASS.ordinal() : SubclassType.SUBCLASS.ordinal();
}
public SubInfo(L2PcInstance player)

View File

@ -18,7 +18,11 @@
*/
package com.l2jserver.gameserver.network.serverpackets;
import com.l2jserver.Config;
import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
import com.l2jserver.gameserver.model.actor.stat.PcStat;
import com.l2jserver.gameserver.model.variables.AccountVariables;
import com.l2jserver.gameserver.network.L2GameClient;
/**
* @author Sdw
@ -32,6 +36,12 @@ public class ExVitalityEffectInfo extends L2GameServerPacket
_points = cha.getVitalityPoints();
}
public ExVitalityEffectInfo(L2GameClient client)
{
final AccountVariables vars = new AccountVariables(client.getAccountName());
_points = vars.getInt(PcStat.VITALITY_VARIABLE, Config.STARTING_VITALITY_POINTS);
}
@Override
protected final void writeImpl()
{
@ -39,7 +49,7 @@ public class ExVitalityEffectInfo extends L2GameServerPacket
writeH(0x118);
writeD(_points);
writeD(0x00); // Vitality Bonus
writeD((int) (Config.RATE_VITALITY_EXP_MULTIPLIER * 100)); // Vitality Bonus
writeH(0x05); // How much vitality items remaining for use
writeH(0x05); // Max number of items for use
}

View File

@ -19,7 +19,6 @@
package com.l2jserver.gameserver.network.serverpackets;
import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
import com.l2jserver.gameserver.model.entity.RecoBonus;
/**
* ExVoteSystemInfo packet implementation.
@ -37,9 +36,9 @@ public class ExVoteSystemInfo extends L2GameServerPacket
{
_recomLeft = player.getRecomLeft();
_recomHave = player.getRecomHave();
_bonusTime = player.getRecomBonusTime();
_bonusVal = RecoBonus.getRecoBonus(player);
_bonusType = player.getRecomBonusType();
_bonusTime = 0;
_bonusVal = 0;
_bonusType = 0;
}
@Override

View File

@ -0,0 +1,43 @@
/*
* Copyright (C) 2004-2015 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.model.actor.instance.L2PcInstance;
/**
* @author UnAfraid
*/
public class ExWorldChatCnt extends L2GameServerPacket
{
private final int _points;
public ExWorldChatCnt(L2PcInstance activeChar)
{
_points = activeChar.getLevel() < Config.WORLD_CHAT_MIN_LEVEL ? 0 : activeChar.getWorldChatPoints();
}
@Override
protected void writeImpl()
{
writeC(0xFE);
writeH(0x173);
writeD(_points);
}
}

View File

@ -55,6 +55,8 @@ public final class GMHennaInfo extends L2GameServerPacket
writeC(_activeChar.getHennaStatMEN()); // equip MEN
writeC(_activeChar.getHennaStatDEX()); // equip DEX
writeC(_activeChar.getHennaStatWIT()); // equip WIT
writeC(0x00); // equip LUC
writeC(0x00); // equip CHA
writeD(3); // Slots
writeD(_hennas.size()); // Size
for (L2Henna henna : _hennas)
@ -62,5 +64,8 @@ public final class GMHennaInfo extends L2GameServerPacket
writeD(henna.getDyeId());
writeD(0x01);
}
writeD(0x00);
writeD(0x00);
writeD(0x00);
}
}

View File

@ -109,8 +109,8 @@ public class GMViewCharacterInfo extends L2GameServerPacket
writeD(_activeChar.getPAtkSpd());
writeD(_activeChar.getMDef(null, null));
writeD(0x00); // magic evasion
writeD(0x00); // magic accuracy
writeD(_activeChar.getMagicEvasionRate(null));
writeD(_activeChar.getMagicAccuracy());
writeD(_activeChar.getMCriticalHit(null, null));
writeD(_activeChar.getPvpFlag()); // 0-non-pvp 1-pvp = violett name

View File

@ -37,11 +37,13 @@ public class GMViewPledgeInfo extends L2GameServerPacket
protected final void writeImpl()
{
writeC(0x96);
writeD(0x00);
writeS(_activeChar.getName());
writeD(_clan.getId());
writeD(0x00);
writeS(_clan.getName());
writeS(_clan.getLeaderName());
writeD(_clan.getCrestId()); // -> no, it's no longer used (nuocnam) fix by game
writeD(_clan.getLevel());
writeD(_clan.getCastleId());
@ -51,14 +53,14 @@ public class GMViewPledgeInfo extends L2GameServerPacket
writeD(_clan.getReputationScore());
writeD(0x00);
writeD(0x00);
writeD(0x00);
writeD(_clan.getAllyId()); // c2
writeS(_clan.getAllyName()); // c2
writeD(_clan.getAllyCrestId()); // c2
writeD(_clan.isAtWar() ? 1 : 0); // c3
writeD(0x00); // T3 Unknown
writeD(_clan.getMembers().length);
writeD(_clan.getMembers().size());
for (L2ClanMember member : _clan.getMembers())
{
if (member != null)

View File

@ -50,6 +50,7 @@ public class GMViewSkillInfo extends L2GameServerPacket
writeD(skill.isPassive() ? 1 : 0);
writeD(skill.getDisplayLevel());
writeD(skill.getDisplayId());
writeD(0x00);
writeC(isDisabled && skill.isClanSkill() ? 1 : 0);
writeC(SkillData.getInstance().isEnchantable(skill.getDisplayId()) ? 1 : 0);
}

View File

@ -43,29 +43,16 @@ public class GmViewQuestInfo extends L2GameServerPacket
Quest[] questList = _activeChar.getAllActiveQuests();
if (questList.length == 0)
{
writeC(0);
writeH(0);
writeH(0);
return;
}
writeH(questList.length); // quest count
for (Quest q : questList)
{
final QuestState qs = _activeChar.getQuestState(q.getName());
writeD(q.getId());
QuestState qs = _activeChar.getQuestState(q.getName());
if (qs == null)
{
writeD(0);
continue;
}
writeD(qs.getInt("cond")); // stage of quest progress
writeD(qs == null ? 0 : qs.getInt("cond"));
}
writeH(0x00); // some size
// for size; ddQQ
}
}

View File

@ -23,6 +23,7 @@ import java.util.logging.Logger;
import org.mmocore.network.SendablePacket;
import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
import com.l2jserver.gameserver.model.interfaces.IPositionable;
import com.l2jserver.gameserver.model.interfaces.IUpdateTypeComponent;
import com.l2jserver.gameserver.model.itemcontainer.Inventory;
@ -178,8 +179,23 @@ public abstract class L2GameServerPacket extends SendablePacket<L2GameClient>
protected abstract void writeImpl();
/**
* @param masks
* @param type
* @return {@code true} if the mask contains the current update component type
*/
protected static boolean containsMask(int masks, IUpdateTypeComponent type)
{
return (masks & type.getMask()) == type.getMask();
}
/**
* Sends this packet to the target player, useful for lambda operations like <br>
* {@code L2World.getInstance().getPlayers().forEach(packet::sendTo)}
* @param player
*/
public void sendTo(L2PcInstance player)
{
player.sendPacket(this);
}
}

View File

@ -18,6 +18,8 @@
*/
package com.l2jserver.gameserver.network.serverpackets;
import java.util.Collection;
import com.l2jserver.gameserver.model.L2Clan;
import com.l2jserver.gameserver.model.L2Clan.SubPledge;
import com.l2jserver.gameserver.model.L2ClanMember;
@ -27,7 +29,7 @@ import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
public class PledgeShowMemberListAll extends L2GameServerPacket
{
private final L2Clan _clan;
private final L2ClanMember[] _members;
private final Collection<L2ClanMember> _members;
private int _pledgeType;
public PledgeShowMemberListAll(L2Clan clan)

View File

@ -19,6 +19,7 @@
package com.l2jserver.gameserver.network.serverpackets;
import com.l2jserver.gameserver.datatables.ClanTable;
import com.l2jserver.gameserver.enums.SiegeClanType;
import com.l2jserver.gameserver.model.L2Clan;
import com.l2jserver.gameserver.model.L2SiegeClan;
import com.l2jserver.gameserver.model.entity.Castle;
@ -60,69 +61,71 @@ public final class SiegeDefenderList extends L2GameServerPacket
{
writeC(0xcb);
writeD(_castle.getResidenceId());
writeD(0x00); // 0
writeD(0x01); // 1
writeD(0x00); // 0
int size = _castle.getSiege().getDefenderClans().size() + _castle.getSiege().getDefenderWaitingClans().size();
if (size > 0)
writeD(0x00); // Unknown
writeD(0x01); // Unknown
writeD(0x00); // Unknown
final int size = _castle.getSiege().getDefenderWaitingClans().size() + _castle.getSiege().getDefenderClans().size() + (_castle.getOwner() != null ? 1 : 0);
writeD(size);
writeD(size);
// Add owners
final L2Clan ownerClan = _castle.getOwner();
if (ownerClan != null)
{
L2Clan clan;
writeD(size);
writeD(size);
// Listing the Lord and the approved clans
for (L2SiegeClan siegeclan : _castle.getSiege().getDefenderClans())
{
clan = ClanTable.getInstance().getClan(siegeclan.getClanId());
if (clan == null)
{
continue;
}
writeD(clan.getId());
writeS(clan.getName());
writeS(clan.getLeaderName());
writeD(clan.getCrestId());
writeD(0x00); // signed time (seconds) (not storated by L2J)
switch (siegeclan.getType())
{
case OWNER:
writeD(0x01); // owner
break;
case DEFENDER_PENDING:
writeD(0x02); // approved
break;
case DEFENDER:
writeD(0x03); // waiting approved
break;
default:
writeD(0x00);
break;
}
writeD(clan.getAllyId());
writeS(clan.getAllyName());
writeS(""); // AllyLeaderName
writeD(clan.getAllyCrestId());
}
for (L2SiegeClan siegeclan : _castle.getSiege().getDefenderWaitingClans())
{
clan = ClanTable.getInstance().getClan(siegeclan.getClanId());
writeD(clan.getId());
writeS(clan.getName());
writeS(clan.getLeaderName());
writeD(clan.getCrestId());
writeD(0x00); // signed time (seconds) (not storated by L2J)
writeD(0x02); // waiting approval
writeD(clan.getAllyId());
writeS(clan.getAllyName());
writeS(""); // AllyLeaderName
writeD(clan.getAllyCrestId());
}
writeD(ownerClan.getId());
writeS(ownerClan.getName());
writeS(ownerClan.getLeaderName());
writeD(ownerClan.getCrestId());
writeD(0x00); // signed time (seconds) (not storated by L2J)
writeD(SiegeClanType.OWNER.ordinal());
writeD(ownerClan.getAllyId());
writeS(ownerClan.getAllyName());
writeS(""); // AllyLeaderName
writeD(ownerClan.getAllyCrestId());
}
else
// List of confirmed defenders
for (L2SiegeClan siegeClan : _castle.getSiege().getDefenderClans())
{
writeD(0x00);
writeD(0x00);
final L2Clan defendingClan = ClanTable.getInstance().getClan(siegeClan.getClanId());
if ((defendingClan == null) || (defendingClan == _castle.getOwner()))
{
continue;
}
writeD(defendingClan.getId());
writeS(defendingClan.getName());
writeS(defendingClan.getLeaderName());
writeD(defendingClan.getCrestId());
writeD(0x00); // signed time (seconds) (not storated by L2J)
writeD(SiegeClanType.DEFENDER.ordinal());
writeD(defendingClan.getAllyId());
writeS(defendingClan.getAllyName());
writeS(""); // AllyLeaderName
writeD(defendingClan.getAllyCrestId());
}
// List of not confirmed defenders
for (L2SiegeClan siegeClan : _castle.getSiege().getDefenderWaitingClans())
{
final L2Clan defendingClan = ClanTable.getInstance().getClan(siegeClan.getClanId());
if (defendingClan == null)
{
continue;
}
writeD(defendingClan.getId());
writeS(defendingClan.getName());
writeS(defendingClan.getLeaderName());
writeD(defendingClan.getCrestId());
writeD(0x00); // signed time (seconds) (not storated by L2J)
writeD(SiegeClanType.DEFENDER_PENDING.ordinal());
writeD(defendingClan.getAllyId());
writeS(defendingClan.getAllyName());
writeS(""); // AllyLeaderName
writeD(defendingClan.getAllyCrestId());
}
}
}

View File

@ -1,389 +1,389 @@
/*
* Copyright (C) 2004-2015 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.gameserver.datatables.ExperienceTable;
import com.l2jserver.gameserver.enums.UserInfoType;
import com.l2jserver.gameserver.instancemanager.RaidBossPointsManager;
import com.l2jserver.gameserver.model.Elementals;
import com.l2jserver.gameserver.model.L2Clan;
import com.l2jserver.gameserver.model.L2Party;
import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
import com.l2jserver.gameserver.model.zone.ZoneId;
/**
* @author Sdw, UnAfraid
*/
public class UserInfo extends AbstractMaskPacket<UserInfoType>
{
private final L2PcInstance _activeChar;
private final int _relation;
private final int _runSpd;
private final int _walkSpd;
private final int _swimRunSpd;
private final int _swimWalkSpd;
private final int _flRunSpd = 0;
private final int _flWalkSpd = 0;
private final int _flyRunSpd;
private final int _flyWalkSpd;
private final double _moveMultiplier;
private int _enchantLevel = 0;
private int _armorEnchant = 0;
private final byte[] _masks = new byte[]
{
(byte) 0x00,
(byte) 0x00,
(byte) 0x00
};
private int _initSize = 5;
public UserInfo(L2PcInstance cha)
{
this(cha, true);
}
public UserInfo(L2PcInstance cha, boolean addAll)
{
_activeChar = cha;
_relation = calculateRelation(cha);
_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;
_enchantLevel = cha.getInventory().getWeaponEnchant();
_armorEnchant = cha.getInventory().getArmorMinEnchant();
if (addAll)
{
addComponentType(UserInfoType.values());
}
}
@Override
protected byte[] getMasks()
{
return _masks;
}
@Override
protected void onNewMaskAdded(UserInfoType component)
{
calcBlockSize(component);
}
private void calcBlockSize(UserInfoType type)
{
switch (type)
{
case BASIC_INFO:
{
_initSize += type.getBlockLength() + (_activeChar.getName().length() * 2);
break;
}
case CLAN:
{
_initSize += type.getBlockLength() + (_activeChar.getTitle().length() * 2);
break;
}
default:
{
_initSize += type.getBlockLength();
break;
}
}
}
@Override
protected void writeImpl()
{
writeC(0x32);
writeD(_activeChar.getObjectId());
writeD(_initSize);
writeH(23);
writeB(_masks);
if (containsMask(UserInfoType.RELATION))
{
writeD(_relation);
}
if (containsMask(UserInfoType.BASIC_INFO))
{
writeH(16 + (_activeChar.getName().length() * 2));
writeString(_activeChar.getName());
writeC(_activeChar.isGM() ? 0x01 : 0x00);
writeC(_activeChar.getRace().ordinal());
writeC(_activeChar.getAppearance().getSex() ? 0x01 : 0x00);
writeD(_activeChar.getBaseClass());
writeD(_activeChar.getClassId().getId());
writeC(_activeChar.getLevel());
}
if (containsMask(UserInfoType.BASE_STATS))
{
writeH(18);
writeH(_activeChar.getSTR());
writeH(_activeChar.getDEX());
writeH(_activeChar.getCON());
writeH(_activeChar.getINT());
writeH(_activeChar.getWIT());
writeH(_activeChar.getMEN());
writeH(_activeChar.getLUC());
writeH(_activeChar.getCHA());
}
if (containsMask(UserInfoType.MAX_HPCPMP))
{
writeH(14);
writeD(_activeChar.getMaxHp());
writeD(_activeChar.getMaxMp());
writeD(_activeChar.getMaxCp());
}
if (containsMask(UserInfoType.CURRENT_HPMPCP_EXP_SP))
{
writeH(38);
writeD((int) Math.round(_activeChar.getCurrentHp()));
writeD((int) Math.round(_activeChar.getCurrentMp()));
writeD((int) Math.round(_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())));
}
if (containsMask(UserInfoType.ENCHANTLEVEL))
{
writeH(4);
writeC(_enchantLevel);
writeC(_armorEnchant);
}
if (containsMask(UserInfoType.APPAREANCE))
{
writeH(15);
writeD(_activeChar.getVisualHair());
writeD(_activeChar.getVisualHairColor());
writeD(_activeChar.getVisualFace());
writeC(_activeChar.isHairAccessoryEnabled() ? 0x01 : 0x00);
}
if (containsMask(UserInfoType.STATUS))
{
writeH(6);
writeC(_activeChar.getMountType().ordinal());
writeC(_activeChar.getPrivateStoreType().getId());
writeC(_activeChar.hasDwarvenCraft() ? 1 : 0);
writeC(0x00);
}
if (containsMask(UserInfoType.STATS))
{
writeH(56);
writeH(_activeChar.getActiveWeaponItem() != null ? 40 : 20);
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()); // Seems like atk speed - 1
writeD(_activeChar.getMagicEvasionRate(null));
writeD(_activeChar.getMDef(null, null));
writeD(_activeChar.getMagicAccuracy());
writeD(_activeChar.getMCriticalHit(null, null));
}
if (containsMask(UserInfoType.ELEMENTALS))
{
writeH(14);
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));
}
if (containsMask(UserInfoType.POSITION))
{
writeH(18);
writeD(_activeChar.getX());
writeD(_activeChar.getY());
writeD(_activeChar.getZ());
writeD(_activeChar.getHeading());
}
if (containsMask(UserInfoType.SPEED))
{
writeH(18);
writeH(_runSpd);
writeH(_walkSpd);
writeH(_swimRunSpd);
writeH(_swimWalkSpd);
writeH(_flRunSpd);
writeH(_flWalkSpd);
writeH(_flyRunSpd);
writeH(_flyWalkSpd);
}
if (containsMask(UserInfoType.MULTIPLIER))
{
writeH(18);
writeF(_moveMultiplier);
writeF(_activeChar.getAttackSpeedMultiplier());
}
if (containsMask(UserInfoType.COL_RADIUS_HEIGHT))
{
writeH(18);
writeF(_activeChar.getCollisionRadius());
writeF(_activeChar.getCollisionHeight());
}
if (containsMask(UserInfoType.ATK_ELEMENTAL))
{
writeH(5);
byte attackAttribute = _activeChar.getAttackElement();
writeC(attackAttribute);
writeH(_activeChar.getAttackElementValue(attackAttribute));
}
if (containsMask(UserInfoType.CLAN))
{
writeH(32 + (_activeChar.getTitle().length() * 2));
writeString(_activeChar.getTitle());
writeH(_activeChar.getPledgeType());
writeD(_activeChar.getClanId());
writeD(_activeChar.getClanCrestLargeId());
writeD(_activeChar.getClanCrestId());
writeC(_activeChar.isClanLeader() ? -1 : 0x00);
writeD(_activeChar.getClanPrivileges().getBitmask());
writeD(_activeChar.getAllyId());
writeD(_activeChar.getAllyCrestId());
writeC(_activeChar.isInPartyMatchRoom() ? 0x01 : 0x00);
}
if (containsMask(UserInfoType.SOCIAL))
{
writeH(22);
writeC(_activeChar.getPvpFlag());
writeD(_activeChar.getKarma()); // Reputation
writeC(_activeChar.isNoble() ? 0x01 : 0x00);
writeC(_activeChar.isHero() ? 0x01 : 0x00);
writeC(_activeChar.getPledgeClass());
writeD(_activeChar.getPkKills());
writeD(_activeChar.getPvpKills());
writeD(_activeChar.getRecomLeft());
}
if (containsMask(UserInfoType.VITA_FAME))
{
writeH(15);
writeD(_activeChar.getVitalityPoints());
writeC(0x00); // Vita Bonus
writeD(_activeChar.getFame());
writeD(RaidBossPointsManager.getInstance().getPointsByOwnerId(_activeChar.getObjectId()));
}
if (containsMask(UserInfoType.SLOTS))
{
writeH(9);
writeC(_activeChar.getInventory().getTalismanSlots()); // Confirmed
writeC(_activeChar.getInventory().getBroochJewelSlots()); // Confirmed
writeC(_activeChar.getTeam().getId()); // Confirmed
writeC(0x00); // Red dotted ring on the floor
writeC(0x00);
writeC(0x00);
writeC(0x00);
}
if (containsMask(UserInfoType.MOVEMENTS))
{
writeH(4);
writeC(_activeChar.isInsideZone(ZoneId.WATER) ? 1 : _activeChar.isFlyingMounted() ? 2 : 0);
writeC(_activeChar.isRunning() ? 0x01 : 0x00);
}
if (containsMask(UserInfoType.COLOR))
{
writeH(10);
writeD(_activeChar.getAppearance().getNameColor());
writeD(_activeChar.getAppearance().getTitleColor());
}
if (containsMask(UserInfoType.INVENTORY_LIMIT))
{
writeH(9);
writeH(0x00);
writeH(0x00);
writeH(_activeChar.getInventoryLimit());
writeC(0x00); // if greater than 1 show the attack cursor when interacting
}
if (containsMask(UserInfoType.UNK_3))
{
writeH(9);
writeC(0x00);
writeH(0x00);
writeD(0x00);
}
}
private int calculateRelation(L2PcInstance activeChar)
{
int relation = 0;
final L2Party party = activeChar.getParty();
final L2Clan clan = activeChar.getClan();
if (party != null)
{
relation |= 0x08; // Party member
if (party.getLeader() == _activeChar)
{
relation |= 0x10; // Party leader
}
}
if (clan != null)
{
relation |= 0x20; // Clan member
if (clan.getLeaderId() == activeChar.getObjectId())
{
relation |= 0x40; // Clan leader
}
}
if (activeChar.isInSiege())
{
relation |= 0x80; // In siege
}
return relation;
}
}
/*
* Copyright (C) 2004-2015 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.gameserver.datatables.ExperienceTable;
import com.l2jserver.gameserver.enums.UserInfoType;
import com.l2jserver.gameserver.instancemanager.RaidBossPointsManager;
import com.l2jserver.gameserver.model.Elementals;
import com.l2jserver.gameserver.model.L2Clan;
import com.l2jserver.gameserver.model.L2Party;
import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
import com.l2jserver.gameserver.model.zone.ZoneId;
/**
* @author Sdw, UnAfraid
*/
public class UserInfo extends AbstractMaskPacket<UserInfoType>
{
private final L2PcInstance _activeChar;
private final int _relation;
private final int _runSpd;
private final int _walkSpd;
private final int _swimRunSpd;
private final int _swimWalkSpd;
private final int _flRunSpd = 0;
private final int _flWalkSpd = 0;
private final int _flyRunSpd;
private final int _flyWalkSpd;
private final double _moveMultiplier;
private int _enchantLevel = 0;
private int _armorEnchant = 0;
private final byte[] _masks = new byte[]
{
(byte) 0x00,
(byte) 0x00,
(byte) 0x00
};
private int _initSize = 5;
public UserInfo(L2PcInstance cha)
{
this(cha, true);
}
public UserInfo(L2PcInstance cha, boolean addAll)
{
_activeChar = cha;
_relation = calculateRelation(cha);
_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;
_enchantLevel = cha.getInventory().getWeaponEnchant();
_armorEnchant = cha.getInventory().getArmorMinEnchant();
if (addAll)
{
addComponentType(UserInfoType.values());
}
}
@Override
protected byte[] getMasks()
{
return _masks;
}
@Override
protected void onNewMaskAdded(UserInfoType component)
{
calcBlockSize(component);
}
private void calcBlockSize(UserInfoType type)
{
switch (type)
{
case BASIC_INFO:
{
_initSize += type.getBlockLength() + (_activeChar.getName().length() * 2);
break;
}
case CLAN:
{
_initSize += type.getBlockLength() + (_activeChar.getTitle().length() * 2);
break;
}
default:
{
_initSize += type.getBlockLength();
break;
}
}
}
@Override
protected void writeImpl()
{
writeC(0x32);
writeD(_activeChar.getObjectId());
writeD(_initSize);
writeH(23);
writeB(_masks);
if (containsMask(UserInfoType.RELATION))
{
writeD(_relation);
}
if (containsMask(UserInfoType.BASIC_INFO))
{
writeH(16 + (_activeChar.getName().length() * 2));
writeString(_activeChar.getName());
writeC(_activeChar.isGM() ? 0x01 : 0x00);
writeC(_activeChar.getRace().ordinal());
writeC(_activeChar.getAppearance().getSex() ? 0x01 : 0x00);
writeD(_activeChar.getBaseClass());
writeD(_activeChar.getClassId().getId());
writeC(_activeChar.getLevel());
}
if (containsMask(UserInfoType.BASE_STATS))
{
writeH(18);
writeH(_activeChar.getSTR());
writeH(_activeChar.getDEX());
writeH(_activeChar.getCON());
writeH(_activeChar.getINT());
writeH(_activeChar.getWIT());
writeH(_activeChar.getMEN());
writeH(_activeChar.getLUC());
writeH(_activeChar.getCHA());
}
if (containsMask(UserInfoType.MAX_HPCPMP))
{
writeH(14);
writeD(_activeChar.getMaxHp());
writeD(_activeChar.getMaxMp());
writeD(_activeChar.getMaxCp());
}
if (containsMask(UserInfoType.CURRENT_HPMPCP_EXP_SP))
{
writeH(38);
writeD((int) Math.round(_activeChar.getCurrentHp()));
writeD((int) Math.round(_activeChar.getCurrentMp()));
writeD((int) Math.round(_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())));
}
if (containsMask(UserInfoType.ENCHANTLEVEL))
{
writeH(4);
writeC(_enchantLevel);
writeC(_armorEnchant);
}
if (containsMask(UserInfoType.APPAREANCE))
{
writeH(15);
writeD(_activeChar.getVisualHair());
writeD(_activeChar.getVisualHairColor());
writeD(_activeChar.getVisualFace());
writeC(_activeChar.isHairAccessoryEnabled() ? 0x01 : 0x00);
}
if (containsMask(UserInfoType.STATUS))
{
writeH(6);
writeC(_activeChar.getMountType().ordinal());
writeC(_activeChar.getPrivateStoreType().getId());
writeC(_activeChar.hasDwarvenCraft() ? 1 : 0);
writeC(_activeChar.getAbilityPointsUsed());
}
if (containsMask(UserInfoType.STATS))
{
writeH(56);
writeH(_activeChar.getActiveWeaponItem() != null ? 40 : 20);
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()); // Seems like atk speed - 1
writeD(_activeChar.getMagicEvasionRate(null));
writeD(_activeChar.getMDef(null, null));
writeD(_activeChar.getMagicAccuracy());
writeD(_activeChar.getMCriticalHit(null, null));
}
if (containsMask(UserInfoType.ELEMENTALS))
{
writeH(14);
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));
}
if (containsMask(UserInfoType.POSITION))
{
writeH(18);
writeD(_activeChar.getX());
writeD(_activeChar.getY());
writeD(_activeChar.getZ());
writeD(_activeChar.getHeading());
}
if (containsMask(UserInfoType.SPEED))
{
writeH(18);
writeH(_runSpd);
writeH(_walkSpd);
writeH(_swimRunSpd);
writeH(_swimWalkSpd);
writeH(_flRunSpd);
writeH(_flWalkSpd);
writeH(_flyRunSpd);
writeH(_flyWalkSpd);
}
if (containsMask(UserInfoType.MULTIPLIER))
{
writeH(18);
writeF(_moveMultiplier);
writeF(_activeChar.getAttackSpeedMultiplier());
}
if (containsMask(UserInfoType.COL_RADIUS_HEIGHT))
{
writeH(18);
writeF(_activeChar.getCollisionRadius());
writeF(_activeChar.getCollisionHeight());
}
if (containsMask(UserInfoType.ATK_ELEMENTAL))
{
writeH(5);
byte attackAttribute = _activeChar.getAttackElement();
writeC(attackAttribute);
writeH(_activeChar.getAttackElementValue(attackAttribute));
}
if (containsMask(UserInfoType.CLAN))
{
writeH(32 + (_activeChar.getTitle().length() * 2));
writeString(_activeChar.getTitle());
writeH(_activeChar.getPledgeType());
writeD(_activeChar.getClanId());
writeD(_activeChar.getClanCrestLargeId());
writeD(_activeChar.getClanCrestId());
writeC(_activeChar.isClanLeader() ? -1 : 0x00);
writeD(_activeChar.getClanPrivileges().getBitmask());
writeD(_activeChar.getAllyId());
writeD(_activeChar.getAllyCrestId());
writeC(_activeChar.isInPartyMatchRoom() ? 0x01 : 0x00);
}
if (containsMask(UserInfoType.SOCIAL))
{
writeH(22);
writeC(_activeChar.getPvpFlag());
writeD(_activeChar.getKarma()); // Reputation
writeC(_activeChar.isNoble() ? 0x01 : 0x00);
writeC(_activeChar.isHero() ? 0x01 : 0x00);
writeC(_activeChar.getPledgeClass());
writeD(_activeChar.getPkKills());
writeD(_activeChar.getPvpKills());
writeD(_activeChar.getRecomLeft());
}
if (containsMask(UserInfoType.VITA_FAME))
{
writeH(15);
writeD(_activeChar.getVitalityPoints());
writeC(0x00); // Vita Bonus
writeD(_activeChar.getFame());
writeD(RaidBossPointsManager.getInstance().getPointsByOwnerId(_activeChar.getObjectId()));
}
if (containsMask(UserInfoType.SLOTS))
{
writeH(9);
writeC(_activeChar.getInventory().getTalismanSlots()); // Confirmed
writeC(_activeChar.getInventory().getBroochJewelSlots()); // Confirmed
writeC(_activeChar.getTeam().getId()); // Confirmed
writeC(0x00); // Red dotted ring on the floor
writeC(0x00);
writeC(0x00);
writeC(0x00);
}
if (containsMask(UserInfoType.MOVEMENTS))
{
writeH(4);
writeC(_activeChar.isInsideZone(ZoneId.WATER) ? 1 : _activeChar.isFlyingMounted() ? 2 : 0);
writeC(_activeChar.isRunning() ? 0x01 : 0x00);
}
if (containsMask(UserInfoType.COLOR))
{
writeH(10);
writeD(_activeChar.getAppearance().getNameColor());
writeD(_activeChar.getAppearance().getTitleColor());
}
if (containsMask(UserInfoType.INVENTORY_LIMIT))
{
writeH(9);
writeH(0x00);
writeH(0x00);
writeH(_activeChar.getInventoryLimit());
writeC(0x00); // if greater than 1 show the attack cursor when interacting
}
if (containsMask(UserInfoType.UNK_3))
{
writeH(9);
writeC(0x00);
writeH(0x00);
writeD(0x00);
}
}
private int calculateRelation(L2PcInstance activeChar)
{
int relation = 0;
final L2Party party = activeChar.getParty();
final L2Clan clan = activeChar.getClan();
if (party != null)
{
relation |= 0x08; // Party member
if (party.getLeader() == _activeChar)
{
relation |= 0x10; // Party leader
}
}
if (clan != null)
{
relation |= 0x20; // Clan member
if (clan.getLeaderId() == activeChar.getObjectId())
{
relation |= 0x40; // Clan leader
}
}
if (activeChar.isInSiege())
{
relation |= 0x80; // In siege
}
return relation;
}
}