diff --git a/L2J_Mobius_Essence_5.2_FrostLord/java/org/l2jmobius/gameserver/model/actor/Player.java b/L2J_Mobius_Essence_5.2_FrostLord/java/org/l2jmobius/gameserver/model/actor/Player.java index cf12f0dbb8..b453ef1546 100644 --- a/L2J_Mobius_Essence_5.2_FrostLord/java/org/l2jmobius/gameserver/model/actor/Player.java +++ b/L2J_Mobius_Essence_5.2_FrostLord/java/org/l2jmobius/gameserver/model/actor/Player.java @@ -332,6 +332,7 @@ import org.l2jmobius.gameserver.network.serverpackets.ExUserBoostStat; import org.l2jmobius.gameserver.network.serverpackets.ExUserInfoAbnormalVisualEffect; import org.l2jmobius.gameserver.network.serverpackets.ExUserInfoCubic; import org.l2jmobius.gameserver.network.serverpackets.ExUserInfoInvenWeight; +import org.l2jmobius.gameserver.network.serverpackets.ExUserViewInfoParameter; import org.l2jmobius.gameserver.network.serverpackets.ExVitalExInfo; import org.l2jmobius.gameserver.network.serverpackets.ExVitalityEffectInfo; import org.l2jmobius.gameserver.network.serverpackets.GetOnVehicle; @@ -4214,6 +4215,7 @@ public class Player extends Playable { // Send user info to the current player sendPacket(new UserInfo(this)); + sendPacket(new ExUserViewInfoParameter(this)); // Broadcast char info to known players broadcastCharInfo(); diff --git a/L2J_Mobius_Essence_5.2_FrostLord/java/org/l2jmobius/gameserver/network/serverpackets/ExUserViewInfoParameter.java b/L2J_Mobius_Essence_5.2_FrostLord/java/org/l2jmobius/gameserver/network/serverpackets/ExUserViewInfoParameter.java new file mode 100644 index 0000000000..9715eded4f --- /dev/null +++ b/L2J_Mobius_Essence_5.2_FrostLord/java/org/l2jmobius/gameserver/network/serverpackets/ExUserViewInfoParameter.java @@ -0,0 +1,641 @@ +/* + * This file is part of the L2J Mobius project. + * + * 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 . + */ +package org.l2jmobius.gameserver.network.serverpackets; + +import org.l2jmobius.Config; +import org.l2jmobius.commons.network.PacketWriter; +import org.l2jmobius.gameserver.enums.ItemGrade; +import org.l2jmobius.gameserver.enums.ShotType; +import org.l2jmobius.gameserver.model.actor.Player; +import org.l2jmobius.gameserver.model.stats.Stat; +import org.l2jmobius.gameserver.model.stats.TraitType; +import org.l2jmobius.gameserver.network.OutgoingPackets; + +/** + * @author Mobius + */ +public class ExUserViewInfoParameter implements IClientOutgoingPacket +{ + private final Player _player; + + public ExUserViewInfoParameter(Player player) + { + _player = player; + } + + @Override + public boolean write(PacketWriter packet) + { + OutgoingPackets.EX_USER_VIEW_INFO_PARAMETER.writeId(packet); + + int index = 0; + + // Number of parameters. + packet.writeD(147); + + // XXX Attack Section + // P. Atk. (%) + packet.writeH(index++); + packet.writeD((_player.getPAtk() / Config.MAX_PATK) * 100); + + // P. Atk. (num.) + packet.writeH(index++); + packet.writeD(_player.getPAtk()); + + // M. Atk. (%) + packet.writeH(index++); + packet.writeD((_player.getMAtk() / Config.MAX_MATK) * 100); + + // M. Atk. (num) + packet.writeH(index++); + packet.writeD(_player.getMAtk()); + + // Soulshot Damage - Activation + packet.writeH(index++); + packet.writeD((_player.isChargedShot(ShotType.BLESSED_SOULSHOTS) || _player.isChargedShot(ShotType.SOULSHOTS)) ? (10000 + (_player.getActiveRubyJewel() != null ? (int) _player.getActiveRubyJewel().getBonus() * 1000 : 0)) : 0); + + // Spiritshot Damage - Activation + packet.writeH(index++); + packet.writeD((_player.isChargedShot(ShotType.BLESSED_SPIRITSHOTS) || _player.isChargedShot(ShotType.SPIRITSHOTS)) ? (10000 + (_player.getActiveShappireJewel() != null ? (int) _player.getActiveShappireJewel().getBonus() * 1000 : 0)) : 0); + + // Soulshot Damage - Enchanted Weapons + packet.writeH(index++); + packet.writeD((((_player.getActiveWeaponInstance() != null) && _player.getActiveWeaponInstance().isEnchanted()) ? (int) (_player.getActiveWeaponInstance().getEnchantLevel() * (_player.getActiveWeaponItem().getItemGrade() == ItemGrade.S ? 1.6 : _player.getActiveWeaponItem().getItemGrade() == ItemGrade.A ? 1.4 : _player.getActiveWeaponItem().getItemGrade() == ItemGrade.B ? 0.7 : _player.getActiveWeaponItem().getItemGrade().equals(ItemGrade.C) ? 0.4 : _player.getActiveWeaponItem().getItemGrade().equals(ItemGrade.D) ? 0.4 : 0) * 100) : 0)); + + // Spiritshot Damage - Enchanted Weapons + packet.writeH(index++); + packet.writeD((((_player.getActiveWeaponInstance() != null) && _player.getActiveWeaponInstance().isEnchanted()) ? (int) (_player.getActiveWeaponInstance().getEnchantLevel() * (_player.getActiveWeaponItem().getItemGrade() == ItemGrade.S ? 1.6 : _player.getActiveWeaponItem().getItemGrade() == ItemGrade.A ? 1.4 : _player.getActiveWeaponItem().getItemGrade() == ItemGrade.B ? 0.7 : _player.getActiveWeaponItem().getItemGrade().equals(ItemGrade.C) ? 0.4 : _player.getActiveWeaponItem().getItemGrade().equals(ItemGrade.D) ? 0.4 : 0) * 100) : 0)); + + // Soulshot Damage - Misc. + packet.writeH(index++); + packet.writeD(_player.getActiveRubyJewel() != null ? (int) _player.getActiveRubyJewel().getBonus() * 1000 : 0); + + // Spiritshot Damage - Misc. + packet.writeH(index++); + packet.writeD(_player.getActiveShappireJewel() != null ? (int) _player.getActiveShappireJewel().getBonus() * 1000 : 0); + + // P. Skill Power (%) + packet.writeH(index++); + packet.writeD(0); + + // M. Skill Power (%) + packet.writeH(index++); + packet.writeD(0); + + // Basic PvP Damage + packet.writeH(index++); + packet.writeD((int) _player.getStat().getValue(Stat.PVP_PHYSICAL_ATTACK_DAMAGE) * 100); + + // P. Skill Damage in PvP + packet.writeH(index++); + packet.writeD((int) _player.getStat().getValue(Stat.PVP_PHYSICAL_SKILL_DAMAGE) * 100); + + // M. Skill Damage in PvP + packet.writeH(index++); + packet.writeD((int) _player.getStat().getValue(Stat.PVP_MAGICAL_SKILL_DAMAGE) * 100); + + // Basic PvE Damage + packet.writeH(index++); + packet.writeD((int) _player.getStat().getValue(Stat.PVE_PHYSICAL_ATTACK_DAMAGE) * 100); + + // P. Skill Damage in PvE + packet.writeH(index++); + packet.writeD((int) _player.getStat().getValue(Stat.PVE_PHYSICAL_SKILL_DAMAGE) * 100); + + // M. Skill Damage in PvE + packet.writeH(index++); + packet.writeD((int) _player.getStat().getValue(Stat.PVE_MAGICAL_SKILL_DAMAGE) * 100); + + // XXX Defense Section + // P. Def. (%) + packet.writeH(index++); + packet.writeD((_player.getTemplate().getBasePDef() / _player.getPDef()) * 100); + + // P. Def. (num.) + packet.writeH(index++); + packet.writeD(_player.getPDef()); + + // M. Def. (%) + packet.writeH(index++); + packet.writeD((_player.getTemplate().getBaseMDef() / _player.getMDef()) * 100); + + // M. Def. (num.) + packet.writeH(index++); + packet.writeD(_player.getMDef()); + + // Received PvP Damage + packet.writeH(index++); + packet.writeD((int) _player.getStat().getValue(Stat.PVP_DAMAGE_TAKEN)); + + // Received P. Skill Damage in PvP + packet.writeH(index++); + packet.writeD(0); + + // Received M. Skill Damage in PvP + packet.writeH(index++); + packet.writeD(0); + + // Received PvE Damage + packet.writeH(index++); + packet.writeD((int) _player.getStat().getValue(Stat.PVE_DAMAGE_TAKEN)); + + // Received P. Skill Damage in PvE + packet.writeH(index++); + packet.writeD(0); + + // Received M. Skill Damage in PvE + packet.writeH(index++); + packet.writeD(0); + + packet.writeH(index++); + packet.writeD(0); + + packet.writeH(index++); + packet.writeD(0); + + packet.writeH(index++); + packet.writeD(0); + + packet.writeH(index++); + packet.writeD(0); + + packet.writeH(index++); + packet.writeD(0); + + packet.writeH(index++); + packet.writeD(0); + + // Shield Defense (%) + packet.writeH(index++); + // packet.writeD((_player.getStat().getShldDef() - _player.getShldDef()) / _player.getShldDef()); + packet.writeD(_player.getStat().getShldDef()); + + // Shield Defence (num.) + packet.writeH(index++); + packet.writeD(_player.getShldDef()); + + // Shield Defence Rate + packet.writeH(index++); + packet.writeD(_player.getStat().getShldDef()); + + // M. Damage Resistance (%) + packet.writeH(index++); + packet.writeD(0); + + // M. Damage Resistance (num.) + packet.writeH(index++); + packet.writeD(0); + + // M. Damage Reflection (%) + packet.writeH(index++); + packet.writeD(0); + + // M. Damage Reflection Resistance + packet.writeH(index++); + packet.writeD(0); + + // Received Fixed Damage (%) + packet.writeH(index++); + packet.writeD(0); + + // Casting Interruption Rate (%) + packet.writeH(index++); + packet.writeD(0); + + // Casting Interruption Rate (num.) + packet.writeH(index++); + packet.writeD(0); + + // XXX Accuracy Section + // P. Accuracy (%) + packet.writeH(index++); + packet.writeD(0); + + // P. Accuracy (num.) + packet.writeH(index++); + packet.writeD(_player.getAccuracy()); + + // M. Accuracy (%) + packet.writeH(index++); + packet.writeD(0); + + // M. Accuracy (num.) + packet.writeH(index++); + packet.writeD(_player.getMagicAccuracy()); + + // Vital Point Attack Rate (%) + packet.writeH(index++); + packet.writeD(0); + + // Vital Point Attack Rate (num.) + packet.writeH(index++); + packet.writeD(0); + + // XXX Evasion Section + // P. Evasion (%) + packet.writeH(index++); + packet.writeD(((_player.getEvasionRate() * 100) / Config.MAX_EVASION)); + + // P. Evasion (num.) + packet.writeH(index++); + packet.writeD(_player.getEvasionRate()); + + // M. Evasion (%) + packet.writeH(index++); + packet.writeD(((_player.getMagicEvasionRate() * 100) / Config.MAX_EVASION)); + + // M. Evasion (num.) + packet.writeH(index++); + packet.writeD(_player.getMagicEvasionRate()); + + // Received Vital Point Attack Rate (%) + packet.writeH(index++); + packet.writeD(0); + + // Received Vital Point Attack Rate (num.) + packet.writeH(index++); + packet.writeD(0); + + // P. Skill Evasion (%) + packet.writeH(index++); + packet.writeD(0); + + // M. Skill Evasion (%) + packet.writeH(index++); + packet.writeD(0); + + packet.writeH(index++); + packet.writeD(0); + + packet.writeH(index++); + packet.writeD(0); + + packet.writeH(index++); + packet.writeD(0); + + packet.writeH(index++); + packet.writeD(0); + + packet.writeH(index++); + packet.writeD(0); + + packet.writeH(index++); + packet.writeD(0); + + // XXX Speed Section + // Atk. Spd. (%) + packet.writeH(index++); + packet.writeD(((_player.getPAtkSpd() * 100) / Config.MAX_PATK_SPEED)); + + // Atk. Spd. (num.) + packet.writeH(index++); + packet.writeD(_player.getStat().getPAtkSpd()); + + // Casting Spd. (%) + packet.writeH(index++); + packet.writeD((_player.getMAtkSpd() * 100) / Config.MAX_MATK_SPEED); + + // Casting Spd. (num.) + packet.writeH(index++); + packet.writeD(_player.getStat().getMAtkSpd()); + + // Speed (%) + packet.writeH(index++); + packet.writeD((int) ((_player.getMoveSpeed() * 100) / Config.MAX_RUN_SPEED)); + + // Speed (num.) + packet.writeH(index++); + packet.writeD((int) _player.getStat().getMoveSpeed()); + + // XXX Critical Rate Section + // Basic Critical Rate (%) + packet.writeH(index++); + packet.writeD(_player.getStat().getCriticalHit()); + + // Basic Critical Rate (num.) + packet.writeH(index++); + packet.writeD(_player.getStat().getCriticalHit()); + + // P. Skill Critical Rate (%) + packet.writeH(index++); + packet.writeD(0); + + // P. Skill Critical Rate (num.) + packet.writeH(index++); + packet.writeD(0); + + // M. Skill Critical Rate (%) + packet.writeH(index++); + packet.writeD(0); + + // M. Skill Critical Rate (num.) + packet.writeH(index++); + packet.writeD(0); + + // XXX Critical Damage Section + // Basic Critical Damage (%) + packet.writeH(index++); + packet.writeD((int) _player.getStat().getValue(Stat.CRITICAL_DAMAGE) * 100); + + // Basic Critical Damage (num.) + packet.writeH(index++); + packet.writeD((int) _player.getStat().getCriticalDmg(1) * 100); + + // P. Skill Critical Damage (%) + packet.writeH(index++); + packet.writeD(0); + + // P. Skill Critical Damage (num.) + packet.writeH(index++); + packet.writeD(0); + + // M. Skill Critical Damage (%) + packet.writeH(index++); + packet.writeD(0); + + // M. Skill Critical Damage (num.) + packet.writeH(index++); + packet.writeD(0); + + // XXX Recovery Section + // HP ReCovery Potions' Effect (%) + packet.writeH(index++); + packet.writeD((int) _player.getStat().getValue(Stat.ADDITIONAL_POTION_HP) * 100); + + // HP Recovery Potions' Effect (num.) + packet.writeH(index++); + packet.writeD((int) _player.getStat().getValue(Stat.ADDITIONAL_POTION_HP) * 100); + + // MP Recovery Potions' Effect (%) + packet.writeH(index++); + packet.writeD((int) _player.getStat().getValue(Stat.ADDITIONAL_POTION_MP) * 100); + + // MP Recovery Potions' Effect (num.) + packet.writeH(index++); + packet.writeD((int) _player.getStat().getValue(Stat.ADDITIONAL_POTION_MP) * 100); + + // HP Recovery Rate (%) + packet.writeH(index++); + packet.writeD(_player.getStat().getHpRegen()); + + // HP Recovery Rate (num.) + packet.writeH(index++); + packet.writeD(_player.getStat().getHpRegen()); + + // HP Recovery Rate while standing (%) + packet.writeH(index++); + packet.writeD(!_player.isMoving() ? _player.getStat().getHpRegen() : 0); + + // HP Recovery Rate while standing (num.) + packet.writeH(index++); + packet.writeD(!_player.isMoving() ? _player.getStat().getHpRegen() : 0); + + // HP Recovery Rate while sitting (%) + packet.writeH(index++); + packet.writeD(_player.isSitting() ? _player.getStat().getHpRegen() : 0); + + // HP Recovery Rate while sitting (num.) + packet.writeH(index++); + packet.writeD(_player.isSitting() ? _player.getStat().getHpRegen() : 0); + + // HP Recovery Rate while walking (%) + packet.writeH(index++); + packet.writeD((_player.isMoving() && !_player.isRunning()) ? _player.getStat().getHpRegen() : 0); + + // HP Recovery Rate while walking (num.) + packet.writeH(index++); + packet.writeD((_player.isMoving() && !_player.isRunning()) ? _player.getStat().getHpRegen() : 0); + + // HP Recovery Rate while running (%) + packet.writeH(index++); + packet.writeD(_player.isRunning() ? _player.getStat().getHpRegen() : 0); + + // HP Recovery Rate while running (num.) + packet.writeH(index++); + packet.writeD(_player.isRunning() ? _player.getStat().getHpRegen() : 0); + + // MP Recovery Rate (%) + packet.writeH(index++); + packet.writeD(_player.getStat().getMpRegen()); + + // MP Recovery Rate (num.) + packet.writeH(index++); + packet.writeD(_player.getStat().getMpRegen()); + + // MP Recovery Rate while standing (%) + packet.writeH(index++); + packet.writeD(!_player.isMoving() ? _player.getStat().getMpRegen() : 0); + + // MP Recovery Rate while standing (num.) + packet.writeH(index++); + packet.writeD(!_player.isMoving() ? _player.getStat().getMpRegen() : 0); + + // MP Recovery Rate while sitting (%) + packet.writeH(index++); + packet.writeD(_player.isSitting() ? _player.getStat().getMpRegen() : 0); + + // MP Recovery Rate while sitting (num.) + packet.writeH(index++); + packet.writeD(_player.isSitting() ? _player.getStat().getMpRegen() : 0); + + // MP Recovery Rate while walking (%) + packet.writeH(index++); + packet.writeD((_player.isMoving() && !_player.isRunning()) ? _player.getStat().getMpRegen() : 0); + + // MP Recovery Rate while walking (num.) + packet.writeH(index++); + packet.writeD((_player.isMoving() && !_player.isRunning()) ? _player.getStat().getMpRegen() : 0); + + // MP Recovery Rate while running (%) + packet.writeH(index++); + packet.writeD(_player.isRunning() ? _player.getStat().getMpRegen() : 0); + + // MP Recovery Rate while running (num.) + packet.writeH(index++); + packet.writeD(_player.isRunning() ? _player.getStat().getMpRegen() : 0); + + // CP Recovery Rate (%) + packet.writeH(index++); + packet.writeD(_player.getStat().getCpRegen()); + + // CP Recovery Rate (num.) + packet.writeH(index++); + packet.writeD(_player.getStat().getCpRegen()); + + // CP Recovery Rate while standing (%) + packet.writeH(index++); + packet.writeD(!_player.isMoving() ? _player.getStat().getCpRegen() : 0); + + // CP Recovery Rate while standing (num.) + packet.writeH(index++); + packet.writeD(!_player.isMoving() ? _player.getStat().getCpRegen() : 0); + + // CP Recovery Rate while sitting (%) + packet.writeH(index++); + packet.writeD(_player.isSitting() ? _player.getStat().getCpRegen() : 0); + + // CP Recovery Rate while sitting (num.) + packet.writeH(index++); + packet.writeD(_player.isSitting() ? _player.getStat().getCpRegen() : 0); + + // CP Recovery Rate while walking (%) + packet.writeH(index++); + packet.writeD((_player.isMoving() && !_player.isRunning()) ? _player.getStat().getCpRegen() : 0); + + // CP Recovery Rate while walking (num.) + packet.writeH(index++); + packet.writeD((_player.isMoving() && !_player.isRunning()) ? _player.getStat().getCpRegen() : 0); + + // CP Recovery Rate while running (%) + packet.writeH(index++); + packet.writeD(_player.isRunning() ? _player.getStat().getCpRegen() : 0); + + // CP Recovery Rate while running (num.) + packet.writeH(index++); + packet.writeD(_player.isRunning() ? _player.getStat().getCpRegen() : 0); + + // XXX Skill Cooldown Section + // P. Skill Cooldown (%) + packet.writeH(index++); + packet.writeD((int) _player.getStat().getReuseTypeValue(1) * 100); + + // M. Skill Cooldown (%) + packet.writeH(index++); + packet.writeD((int) _player.getStat().getReuseTypeValue(2) * 100); + + // Song/ Dance Cooldown (%) + packet.writeH(index++); + packet.writeD((int) _player.getStat().getReuseTypeValue(3) * 100); + + // XXX MP Consumption Section + // P. Skill MP Consumption Decrease (%) + packet.writeH(index++); + packet.writeD((int) _player.getStat().getMpConsumeTypeValue(1) * 100); + + // M. Skill MP Consumption Decrease (%) + packet.writeH(index++); + packet.writeD((int) _player.getStat().getMpConsumeTypeValue(2) * 100); + + // Song/ Dance MP Consumption Decrease (%) + packet.writeH(index++); + packet.writeD((int) _player.getStat().getMpConsumeTypeValue(3) * 100); + + // P. Skill MP Consumption Decrease (num.) + packet.writeH(index++); + packet.writeD((int) _player.getStat().getMpConsumeTypeValue(1) * 100); + + // M. Skill MP Consumption Decrease (num.) + packet.writeH(index++); + packet.writeD((int) _player.getStat().getMpConsumeTypeValue(2) * 100); + + // Song/ Dance MP Consumption Decrease (num.) + packet.writeH(index++); + packet.writeD((int) _player.getStat().getMpConsumeTypeValue(3) * 100); + + // XXX Anomalies Section + + // Paralysis Atk. Rate (%) + packet.writeH(index++); + packet.writeD((int) _player.getStat().getAttackTrait(TraitType.PARALYZE) * 100); + + // Shock Atk. Rate (%) + packet.writeH(index++); + packet.writeD((int) _player.getStat().getAttackTrait(TraitType.SHOCK) * 100); + + // Knockback Atk. Rate (%) + packet.writeH(index++); + packet.writeD((int) _player.getStat().getAttackTrait(TraitType.KNOCKBACK) * 100); + + // Sleep Atk. Rate (%) + packet.writeH(index++); + packet.writeD((int) _player.getStat().getAttackTrait(TraitType.SLEEP) * 100); + + // Imprisonment Atk. Rate (%) + packet.writeH(index++); + packet.writeD((int) _player.getStat().getAttackTrait(TraitType.IMPRISON) * 100); + + // Pull Atk. Rate (%) + packet.writeH(index++); + packet.writeD((int) _player.getStat().getAttackTrait(TraitType.PULL) * 100); + + // Fear Atk. Rate (%) + packet.writeH(index++); + packet.writeD((int) _player.getStat().getAttackTrait(TraitType.FEAR) * 100); + + // Silence Atk. Rate (%) + packet.writeH(index++); + packet.writeD((int) _player.getStat().getAttackTrait(TraitType.SILENCE) * 100); + + // Hold Atk. Rate (%) + packet.writeH(index++); + packet.writeD((int) _player.getStat().getAttackTrait(TraitType.HOLD) * 100); + + // Suppression Atk. Rate (%) + packet.writeH(index++); + packet.writeD((int) _player.getStat().getAttackTrait(TraitType.SUPPRESSION) * 100); + + // Infection Atk. Rate (%) + packet.writeH(index++); + packet.writeD((int) _player.getStat().getAttackTrait(TraitType.INFECTION) * 100); + + // Paralysis Resistance (%) + packet.writeH(index++); + packet.writeD((int) _player.getStat().getDefenceTrait(TraitType.PARALYZE) * 100); + + // Shock Resistance (%) + packet.writeH(index++); + packet.writeD((int) _player.getStat().getDefenceTrait(TraitType.SHOCK) * 100); + + // Knockback Resistance (%) + packet.writeH(index++); + packet.writeD((int) _player.getStat().getDefenceTrait(TraitType.KNOCKBACK) * 100); + + // Sleep Resistance (%) + packet.writeH(index++); + packet.writeD((int) _player.getStat().getDefenceTrait(TraitType.SLEEP) * 100); + + // Imprisonment Resistance (%) + packet.writeH(index++); + packet.writeD((int) _player.getStat().getDefenceTrait(TraitType.IMPRISON) * 100); + + // Pull Resistance (%) + packet.writeH(index++); + packet.writeD((int) _player.getStat().getDefenceTrait(TraitType.PULL) * 100); + + // Fear Resistance (%) + packet.writeH(index++); + packet.writeD((int) _player.getStat().getDefenceTrait(TraitType.FEAR) * 100); + + // Silence Resistance (%) + packet.writeH(index++); + packet.writeD((int) _player.getStat().getDefenceTrait(TraitType.SLEEP) * 100); + + // Hold Resistance (%) + packet.writeH(index++); + packet.writeD((int) _player.getStat().getDefenceTrait(TraitType.HOLD) * 100); + + // Suppresion Resistance (%) + packet.writeH(index++); + packet.writeD((int) _player.getStat().getDefenceTrait(TraitType.SUPPRESSION) * 100); + + // Infection Resistance (%) + packet.writeH(index++); + packet.writeD((int) _player.getStat().getDefenceTrait(TraitType.INFECTION) * 100); + + return true; + } +} \ No newline at end of file diff --git a/L2J_Mobius_Essence_6.1_BattleChronicle/java/org/l2jmobius/gameserver/model/actor/Player.java b/L2J_Mobius_Essence_6.1_BattleChronicle/java/org/l2jmobius/gameserver/model/actor/Player.java index 78de649c9d..02cd1b02fc 100644 --- a/L2J_Mobius_Essence_6.1_BattleChronicle/java/org/l2jmobius/gameserver/model/actor/Player.java +++ b/L2J_Mobius_Essence_6.1_BattleChronicle/java/org/l2jmobius/gameserver/model/actor/Player.java @@ -335,6 +335,7 @@ import org.l2jmobius.gameserver.network.serverpackets.ExUserBoostStat; import org.l2jmobius.gameserver.network.serverpackets.ExUserInfoAbnormalVisualEffect; import org.l2jmobius.gameserver.network.serverpackets.ExUserInfoCubic; import org.l2jmobius.gameserver.network.serverpackets.ExUserInfoInvenWeight; +import org.l2jmobius.gameserver.network.serverpackets.ExUserViewInfoParameter; import org.l2jmobius.gameserver.network.serverpackets.ExVitalExInfo; import org.l2jmobius.gameserver.network.serverpackets.ExVitalityEffectInfo; import org.l2jmobius.gameserver.network.serverpackets.GetOnVehicle; @@ -4229,6 +4230,7 @@ public class Player extends Playable { // Send user info to the current player sendPacket(new UserInfo(this)); + sendPacket(new ExUserViewInfoParameter(this)); // Broadcast char info to known players broadcastCharInfo(); diff --git a/L2J_Mobius_Essence_6.1_BattleChronicle/java/org/l2jmobius/gameserver/network/serverpackets/ExUserViewInfoParameter.java b/L2J_Mobius_Essence_6.1_BattleChronicle/java/org/l2jmobius/gameserver/network/serverpackets/ExUserViewInfoParameter.java new file mode 100644 index 0000000000..3530b01bdd --- /dev/null +++ b/L2J_Mobius_Essence_6.1_BattleChronicle/java/org/l2jmobius/gameserver/network/serverpackets/ExUserViewInfoParameter.java @@ -0,0 +1,805 @@ +/* + * This file is part of the L2J Mobius project. + * + * 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 . + */ +package org.l2jmobius.gameserver.network.serverpackets; + +import org.l2jmobius.Config; +import org.l2jmobius.commons.network.PacketWriter; +import org.l2jmobius.gameserver.enums.ItemGrade; +import org.l2jmobius.gameserver.enums.ShotType; +import org.l2jmobius.gameserver.model.actor.Player; +import org.l2jmobius.gameserver.model.item.type.WeaponType; +import org.l2jmobius.gameserver.model.stats.Stat; +import org.l2jmobius.gameserver.model.stats.TraitType; +import org.l2jmobius.gameserver.network.OutgoingPackets; + +/** + * @author Mobius + */ +public class ExUserViewInfoParameter implements IClientOutgoingPacket +{ + private final Player _player; + + public ExUserViewInfoParameter(Player player) + { + _player = player; + } + + @Override + public boolean write(PacketWriter packet) + { + OutgoingPackets.EX_USER_VIEW_INFO_PARAMETER.writeId(packet); + + int index = 0; + + // Number of parameters. + packet.writeD(185); + + // XXX Attack Section + // P. Atk. (%) + packet.writeH(index++); + packet.writeD((_player.getPAtk() / Config.MAX_PATK) * 100); + + // P. Atk. (num.) + packet.writeH(index++); + packet.writeD(_player.getPAtk()); + + // M. Atk. (%) + packet.writeH(index++); + packet.writeD((_player.getMAtk() / Config.MAX_MATK) * 100); + + // M. Atk. (num) + packet.writeH(index++); + packet.writeD(_player.getMAtk()); + + // Soulshot Damage - Activation + packet.writeH(index++); + packet.writeD((_player.isChargedShot(ShotType.BLESSED_SOULSHOTS) || _player.isChargedShot(ShotType.SOULSHOTS)) ? (10000 + (_player.getActiveRubyJewel() != null ? (int) _player.getActiveRubyJewel().getBonus() * 1000 : 0)) : 0); + + // Spiritshot Damage - Activation + packet.writeH(index++); + packet.writeD((_player.isChargedShot(ShotType.BLESSED_SPIRITSHOTS) || _player.isChargedShot(ShotType.SPIRITSHOTS)) ? (10000 + (_player.getActiveShappireJewel() != null ? (int) _player.getActiveShappireJewel().getBonus() * 1000 : 0)) : 0); + + // Soulshot Damage - Enchanted Weapons + packet.writeH(index++); + packet.writeD((((_player.getActiveWeaponInstance() != null) && _player.getActiveWeaponInstance().isEnchanted()) ? (int) (_player.getActiveWeaponInstance().getEnchantLevel() * (_player.getActiveWeaponItem().getItemGrade() == ItemGrade.S ? 1.6 : _player.getActiveWeaponItem().getItemGrade() == ItemGrade.A ? 1.4 : _player.getActiveWeaponItem().getItemGrade() == ItemGrade.B ? 0.7 : _player.getActiveWeaponItem().getItemGrade().equals(ItemGrade.C) ? 0.4 : _player.getActiveWeaponItem().getItemGrade().equals(ItemGrade.D) ? 0.4 : 0) * 100) : 0)); + + // Spiritshot Damage - Enchanted Weapons + packet.writeH(index++); + packet.writeD((((_player.getActiveWeaponInstance() != null) && _player.getActiveWeaponInstance().isEnchanted()) ? (int) (_player.getActiveWeaponInstance().getEnchantLevel() * (_player.getActiveWeaponItem().getItemGrade() == ItemGrade.S ? 1.6 : _player.getActiveWeaponItem().getItemGrade() == ItemGrade.A ? 1.4 : _player.getActiveWeaponItem().getItemGrade() == ItemGrade.B ? 0.7 : _player.getActiveWeaponItem().getItemGrade().equals(ItemGrade.C) ? 0.4 : _player.getActiveWeaponItem().getItemGrade().equals(ItemGrade.D) ? 0.4 : 0) * 100) : 0)); + + // Soulshot Damage - Misc. + packet.writeH(index++); + packet.writeD(_player.getActiveRubyJewel() != null ? (int) _player.getActiveRubyJewel().getBonus() * 1000 : 0); + + // Spiritshot Damage - Misc. + packet.writeH(index++); + packet.writeD(_player.getActiveShappireJewel() != null ? (int) _player.getActiveShappireJewel().getBonus() * 1000 : 0); + + // Basic PvP Damage + packet.writeH(index++); + packet.writeD((int) _player.getStat().getValue(Stat.PVP_PHYSICAL_ATTACK_DAMAGE) * 100); + + // P. Skill Damage in PvP + packet.writeH(index++); + packet.writeD((int) _player.getStat().getValue(Stat.PVP_PHYSICAL_SKILL_DAMAGE) * 100); + + // M. Skill Damage in PvP + packet.writeH(index++); + packet.writeD((int) _player.getStat().getValue(Stat.PVP_MAGICAL_SKILL_DAMAGE) * 100); + + // Inflicted PvP Damage + packet.writeH(index++); + packet.writeD(0); + + // PvP Damage Decrease Ignore + packet.writeH(index++); + packet.writeD(0); + + // Basic PvE Damage + packet.writeH(index++); + packet.writeD((int) _player.getStat().getValue(Stat.PVE_PHYSICAL_ATTACK_DAMAGE) * 100); + + // P. Skill Damage in PvE + packet.writeH(index++); + packet.writeD((int) _player.getStat().getValue(Stat.PVE_PHYSICAL_SKILL_DAMAGE) * 100); + + // M. Skill Damage in PvE + packet.writeH(index++); + packet.writeD((int) _player.getStat().getValue(Stat.PVE_MAGICAL_SKILL_DAMAGE) * 100); + + // PvE Damage + packet.writeH(index++); + packet.writeD(0); + + // PvE Damage Decrease Ignore + packet.writeH(index++); + packet.writeD(0); + + // Basic Power + packet.writeH(index++); + packet.writeD(0); + + // P. Skill Power + packet.writeH(index++); + packet.writeD((int) _player.getStat().getValue(Stat.PHYSICAL_SKILL_POWER) * 100); + + // M. Skill Power + packet.writeH(index++); + packet.writeD((int) _player.getStat().getValue(Stat.MAGICAL_SKILL_POWER) * 100); + + // AoE Skill Damage + packet.writeH(index++); + packet.writeD(0); + + // Damage Bonus - Sword + packet.writeH(index++); + packet.writeD(((_player.getActiveWeaponInstance() != null) && (_player.getActiveWeaponInstance().getItemType() == WeaponType.SWORD)) ? _player.getStat().getWeaponBonusPAtk() : 0); + + // Damage Bonus - Ancient Sword + packet.writeH(index++); + packet.writeD((_player.getActiveWeaponInstance() != null) && (_player.getActiveWeaponInstance().getItemType() == WeaponType.ANCIENTSWORD) ? _player.getStat().getWeaponBonusPAtk() : 0); + + // Damage Bonus - Dagger + packet.writeH(index++); + packet.writeD((_player.getActiveWeaponInstance() != null) && (_player.getActiveWeaponInstance().getItemType() == WeaponType.DAGGER) ? _player.getStat().getWeaponBonusPAtk() : 0); + + // Damage Bonus - Rapier + packet.writeH(index++); + packet.writeD((_player.getActiveWeaponInstance() != null) && (_player.getActiveWeaponInstance().getItemType() == WeaponType.RAPIER) ? _player.getStat().getWeaponBonusPAtk() : 0); + + // Damage Bonus - Blunt Weapon + packet.writeH(index++); + packet.writeD((_player.getActiveWeaponInstance() != null) && ((_player.getActiveWeaponInstance().getItemType() == WeaponType.ETC) || (_player.getActiveWeaponInstance().getItemType() == WeaponType.BLUNT) || (_player.getActiveWeaponInstance().getItemType() == WeaponType.DUALBLUNT)) ? _player.getStat().getWeaponBonusPAtk() : 0); + + // Damage Bonus - Spear + packet.writeH(index++); + packet.writeD((_player.getActiveWeaponInstance() != null) && (_player.getActiveWeaponInstance().getItemType() == WeaponType.POLE) ? _player.getStat().getWeaponBonusPAtk() : 0); + + // Damage Bonus - Fists + packet.writeH(index++); + packet.writeD((_player.getActiveWeaponInstance() != null) && ((_player.getActiveWeaponInstance().getItemType() == WeaponType.FIST) || (_player.getActiveWeaponInstance().getItemType() == WeaponType.DUALFIST)) ? _player.getStat().getWeaponBonusPAtk() : 0); + + // Damage Bonus - Dual Swords + packet.writeH(index++); + packet.writeD((_player.getActiveWeaponInstance() != null) && (_player.getActiveWeaponInstance().getItemType() == WeaponType.DUAL) ? _player.getStat().getWeaponBonusPAtk() : 0); + + // Damage Bonus - Bow + packet.writeH(index++); + packet.writeD((_player.getActiveWeaponInstance() != null) && ((_player.getActiveWeaponInstance().getItemType() == WeaponType.BOW) || (_player.getActiveWeaponInstance().getItemType() == WeaponType.CROSSBOW) || (_player.getActiveWeaponInstance().getItemType() == WeaponType.TWOHANDCROSSBOW)) ? _player.getStat().getWeaponBonusPAtk() : 0); + + // Damage Bonus - Firearms + packet.writeH(index++); + packet.writeD((_player.getActiveWeaponInstance() != null) && (_player.getActiveWeaponInstance().getItemType() == WeaponType.PISTOLS) ? _player.getStat().getWeaponBonusPAtk() : 0); + + // XXX Defense Section + // P. Def. (%) + packet.writeH(index++); + packet.writeD((_player.getTemplate().getBasePDef() / _player.getPDef()) * 100); + + // P. Def. (num.) + packet.writeH(index++); + packet.writeD(_player.getPDef()); + + // M. Def. (%) + packet.writeH(index++); + packet.writeD((_player.getTemplate().getBaseMDef() / _player.getMDef()) * 100); + + // M. Def. (num.) + packet.writeH(index++); + packet.writeD(_player.getMDef()); + + // Soulshot Damage Resistance + packet.writeH(index++); + packet.writeD(0); + + // Spiritshot Damage Resistance + packet.writeH(index++); + packet.writeD(0); + + // Received basic PvP Damage + packet.writeH(index++); + packet.writeD(0); + + // Received P. Skill Damage in PvP + packet.writeH(index++); + packet.writeD(0); + + // Received M. Skill Damage in PvP + packet.writeH(index++); + packet.writeD(0); + + // Received PvP Damage + packet.writeH(index++); + packet.writeD((int) _player.getStat().getValue(Stat.PVP_DAMAGE_TAKEN)); + + // PvP Damage Decrease + packet.writeH(index++); + packet.writeD(0); + + // Received basic PvE Damage + packet.writeH(index++); + packet.writeD(0); + + // Received P. Skill Damage in PvE + packet.writeH(index++); + packet.writeD(0); + + // Received M. Skill Damage in PvE + packet.writeH(index++); + packet.writeD(0); + + // Received PvE Damage + packet.writeH(index++); + packet.writeD((int) _player.getStat().getValue(Stat.PVE_DAMAGE_TAKEN)); + + // PvE Damage Decrease + packet.writeH(index++); + packet.writeD(0); + + // Received basic damage power + packet.writeH(index++); + packet.writeD(0); + + // P. Skill Power when hit + packet.writeH(index++); + packet.writeD(0); + + // M. Skill Power when hit + packet.writeH(index++); + packet.writeD(0); + + // Received AoE Skill Damage + packet.writeH(index++); + packet.writeD(0); + + // Damage Resistance Bonus - Sword + packet.writeH(index++); + packet.writeD((int) _player.getStat().getDefenceTrait(TraitType.SWORD) * 100); + + // Damage Resistance Bonus - Ancient Sword + packet.writeH(index++); + packet.writeD((int) _player.getStat().getDefenceTrait(TraitType.ANCIENTSWORD) * 100); + + // Damage Resistance Bonus - Dagger + packet.writeH(index++); + packet.writeD((int) _player.getStat().getDefenceTrait(TraitType.DAGGER) * 100); + + // Damage Resistance Bonus - Rapier + packet.writeH(index++); + packet.writeD((int) _player.getStat().getDefenceTrait(TraitType.RAPIER) * 100); + + // Damage Resistance Bonus - Blunt Weapon + packet.writeH(index++); + packet.writeD((int) _player.getStat().getDefenceTrait(TraitType.BLUNT) * 100); + + // Damage Resistance Bonus - Spear + packet.writeH(index++); + packet.writeD((int) _player.getStat().getDefenceTrait(TraitType.POLE) * 100); + + // Damage Resistance Bonus - Fists + packet.writeH(index++); + packet.writeD((int) _player.getStat().getDefenceTrait(TraitType.FIST) * 100); + + // Damage Resistance Bonus - Dual Swords + packet.writeH(index++); + packet.writeD((int) _player.getStat().getDefenceTrait(TraitType.DUAL) * 100); + + // Damage Resistance Bonus - Bow + packet.writeH(index++); + packet.writeD((int) _player.getStat().getDefenceTrait(TraitType.BOW) * 100); + + // Damage Resistance Bonus - Firearms + packet.writeH(index++); + packet.writeD((int) _player.getStat().getDefenceTrait(TraitType.PISTOLS) * 100); + + // Shield Defense (%) + packet.writeH(index++); + // packet.writeD((_player.getStat().getShldDef() - _player.getShldDef()) / _player.getShldDef()); + packet.writeD(_player.getStat().getShldDef()); + + // Shield Defence (num.) + packet.writeH(index++); + packet.writeD(_player.getShldDef()); + + // Shield Defence Rate + packet.writeH(index++); + packet.writeD(_player.getStat().getShldDef()); + + // M. Damage Resistance (%) + packet.writeH(index++); + packet.writeD(0); + + // M. Damage Resistance (num.) + packet.writeH(index++); + packet.writeD(0); + + // M. Damage Reflection (%) + packet.writeH(index++); + packet.writeD(0); + + // M. Damage Reflection Resistance + packet.writeH(index++); + packet.writeD(0); + + // Received Fixed Damage (%) + packet.writeH(index++); + packet.writeD(0); + + // Casting Interruption Rate (%) + packet.writeH(index++); + packet.writeD(0); + + // Casting Interruption Rate (num.) + packet.writeH(index++); + packet.writeD(0); + + // XXX Accuracy Section + // P. Accuracy (%) + packet.writeH(index++); + packet.writeD(0); + + // P. Accuracy (num.) + packet.writeH(index++); + packet.writeD(_player.getAccuracy()); + + // M. Accuracy (%) + packet.writeH(index++); + packet.writeD(0); + + // M. Accuracy (num.) + packet.writeH(index++); + packet.writeD(_player.getMagicAccuracy()); + + // Vital Point Attack Rate (%) + packet.writeH(index++); + packet.writeD(0); + + // Vital Point Attack Rate (num.) + packet.writeH(index++); + packet.writeD(0); + + // XXX Evasion Section + // P. Evasion (%) + packet.writeH(index++); + packet.writeD(((_player.getEvasionRate() * 100) / Config.MAX_EVASION)); + + // P. Evasion (num.) + packet.writeH(index++); + packet.writeD(_player.getEvasionRate()); + + // M. Evasion (%) + packet.writeH(index++); + packet.writeD(((_player.getMagicEvasionRate() * 100) / Config.MAX_EVASION)); + + // M. Evasion (num.) + packet.writeH(index++); + packet.writeD(_player.getMagicEvasionRate()); + + // Received Vital Point Attack Rate (%) + packet.writeH(index++); + packet.writeD(0); + + // Received Vital Point Attack Rate (num.) + packet.writeH(index++); + packet.writeD(0); + + // P. Skill Evasion (%) + packet.writeH(index++); + packet.writeD(0); + + // M. Skill Evasion (%) + packet.writeH(index++); + packet.writeD(0); + + // XXX Speed Section + // Atk. Spd. (%) + packet.writeH(index++); + packet.writeD(((_player.getPAtkSpd() * 100) / Config.MAX_PATK_SPEED)); + + // Atk. Spd. (num.) + packet.writeH(index++); + packet.writeD(_player.getStat().getPAtkSpd()); + + // Casting Spd. (%) + packet.writeH(index++); + packet.writeD((_player.getMAtkSpd() * 100) / Config.MAX_MATK_SPEED); + + // Casting Spd. (num.) + packet.writeH(index++); + packet.writeD(_player.getStat().getMAtkSpd()); + + // Speed (%) + packet.writeH(index++); + packet.writeD((int) ((_player.getMoveSpeed() * 100) / Config.MAX_RUN_SPEED)); + + // Speed (num.) + packet.writeH(index++); + packet.writeD((int) _player.getStat().getMoveSpeed()); + + // XXX Critical Rate Section + // Basic Critical Rate (%) + packet.writeH(index++); + packet.writeD(_player.getStat().getCriticalHit()); + + // Basic Critical Rate (num.) + packet.writeH(index++); + packet.writeD(_player.getStat().getCriticalHit()); + + // P. Skill Critical Rate (%) + packet.writeH(index++); + packet.writeD(0); + + // P. Skill Critical Rate (num.) + packet.writeH(index++); + packet.writeD(0); + + // M. Skill Critical Rate (%) + packet.writeH(index++); + packet.writeD(0); + + // M. Skill Critical Rate (num.) + packet.writeH(index++); + packet.writeD(0); + + // Received basic Critical Rate (%) + packet.writeH(index++); + packet.writeD(0); + + // Received basic Critical Rate (num.) + packet.writeH(index++); + packet.writeD(0); + + // Received P. Skill Critical Rate (%) + packet.writeH(index++); + packet.writeD(0); + + // Received P. Skill Critical Rate (num.) + packet.writeH(index++); + packet.writeD(0); + + // Received M. Skill Critical Rate (%) + packet.writeH(index++); + packet.writeD(0); + + // Received M. Skill Critical Rate (num.) + packet.writeH(index++); + packet.writeD(0); + + // XXX Critical Damage Section + // Basic Critical Damage (%) + packet.writeH(index++); + packet.writeD((int) _player.getStat().getValue(Stat.CRITICAL_DAMAGE) * 100); + + // Basic Critical Damage (num.) + packet.writeH(index++); + packet.writeD((int) _player.getStat().getCriticalDmg(1) * 100); + + // P. Skill Critical Damage (%) + packet.writeH(index++); + packet.writeD(0); + + // P. Skill Critical Damage (num.) + packet.writeH(index++); + packet.writeD(0); + + // M. Skill Critical Damage (%) + packet.writeH(index++); + packet.writeD(0); + + // M. Skill Critical Damage (num.) + packet.writeH(index++); + packet.writeD(0); + + // Received Basic Critical Damage (%) + packet.writeH(index++); + packet.writeD(0); + + // Received Basic Critical Damage (num.) + packet.writeH(index++); + packet.writeD(0); + + // Received P. Skill Critical Damage (%) + packet.writeH(index++); + packet.writeD(0); + + // Received P. Skill Critical Damage (num.) + packet.writeH(index++); + packet.writeD(0); + + // Received M. Skill Critical Damage (%) + packet.writeH(index++); + packet.writeD(0); + + // Received M. Skill Critical Damage (num.) + packet.writeH(index++); + packet.writeD(0); + + // XXX Recovery Section + // HP ReCovery Potions' Effect (%) + packet.writeH(index++); + packet.writeD((int) _player.getStat().getValue(Stat.ADDITIONAL_POTION_HP) * 100); + + // HP Recovery Potions' Effect (num.) + packet.writeH(index++); + packet.writeD((int) _player.getStat().getValue(Stat.ADDITIONAL_POTION_HP) * 100); + + // MP Recovery Potions' Effect (%) + packet.writeH(index++); + packet.writeD((int) _player.getStat().getValue(Stat.ADDITIONAL_POTION_MP) * 100); + + // MP Recovery Potions' Effect (num.) + packet.writeH(index++); + packet.writeD((int) _player.getStat().getValue(Stat.ADDITIONAL_POTION_MP) * 100); + + // HP Recovery Rate (%) + packet.writeH(index++); + packet.writeD(_player.getStat().getHpRegen()); + + // HP Recovery Rate (num.) + packet.writeH(index++); + packet.writeD(_player.getStat().getHpRegen()); + + // HP Recovery Rate while standing (%) + packet.writeH(index++); + packet.writeD(!_player.isMoving() ? _player.getStat().getHpRegen() : 0); + + // HP Recovery Rate while standing (num.) + packet.writeH(index++); + packet.writeD(!_player.isMoving() ? _player.getStat().getHpRegen() : 0); + + // HP Recovery Rate while sitting (%) + packet.writeH(index++); + packet.writeD(_player.isSitting() ? _player.getStat().getHpRegen() : 0); + + // HP Recovery Rate while sitting (num.) + packet.writeH(index++); + packet.writeD(_player.isSitting() ? _player.getStat().getHpRegen() : 0); + + // HP Recovery Rate while walking (%) + packet.writeH(index++); + packet.writeD((_player.isMoving() && !_player.isRunning()) ? _player.getStat().getHpRegen() : 0); + + // HP Recovery Rate while walking (num.) + packet.writeH(index++); + packet.writeD((_player.isMoving() && !_player.isRunning()) ? _player.getStat().getHpRegen() : 0); + + // HP Recovery Rate while running (%) + packet.writeH(index++); + packet.writeD(_player.isRunning() ? _player.getStat().getHpRegen() : 0); + + // HP Recovery Rate while running (num.) + packet.writeH(index++); + packet.writeD(_player.isRunning() ? _player.getStat().getHpRegen() : 0); + + // MP Recovery Rate (%) + packet.writeH(index++); + packet.writeD(_player.getStat().getMpRegen()); + + // MP Recovery Rate (num.) + packet.writeH(index++); + packet.writeD(_player.getStat().getMpRegen()); + + // MP Recovery Rate while standing (%) + packet.writeH(index++); + packet.writeD(!_player.isMoving() ? _player.getStat().getMpRegen() : 0); + + // MP Recovery Rate while standing (num.) + packet.writeH(index++); + packet.writeD(!_player.isMoving() ? _player.getStat().getMpRegen() : 0); + + // MP Recovery Rate while sitting (%) + packet.writeH(index++); + packet.writeD(_player.isSitting() ? _player.getStat().getMpRegen() : 0); + + // MP Recovery Rate while sitting (num.) + packet.writeH(index++); + packet.writeD(_player.isSitting() ? _player.getStat().getMpRegen() : 0); + + // MP Recovery Rate while walking (%) + packet.writeH(index++); + packet.writeD((_player.isMoving() && !_player.isRunning()) ? _player.getStat().getMpRegen() : 0); + + // MP Recovery Rate while walking (num.) + packet.writeH(index++); + packet.writeD((_player.isMoving() && !_player.isRunning()) ? _player.getStat().getMpRegen() : 0); + + // MP Recovery Rate while running (%) + packet.writeH(index++); + packet.writeD(_player.isRunning() ? _player.getStat().getMpRegen() : 0); + + // MP Recovery Rate while running (num.) + packet.writeH(index++); + packet.writeD(_player.isRunning() ? _player.getStat().getMpRegen() : 0); + + // CP Recovery Rate (%) + packet.writeH(index++); + packet.writeD(_player.getStat().getCpRegen()); + + // CP Recovery Rate (num.) + packet.writeH(index++); + packet.writeD(_player.getStat().getCpRegen()); + + // CP Recovery Rate while standing (%) + packet.writeH(index++); + packet.writeD(!_player.isMoving() ? _player.getStat().getCpRegen() : 0); + + // CP Recovery Rate while standing (num.) + packet.writeH(index++); + packet.writeD(!_player.isMoving() ? _player.getStat().getCpRegen() : 0); + + // CP Recovery Rate while sitting (%) + packet.writeH(index++); + packet.writeD(_player.isSitting() ? _player.getStat().getCpRegen() : 0); + + // CP Recovery Rate while sitting (num.) + packet.writeH(index++); + packet.writeD(_player.isSitting() ? _player.getStat().getCpRegen() : 0); + + // CP Recovery Rate while walking (%) + packet.writeH(index++); + packet.writeD((_player.isMoving() && !_player.isRunning()) ? _player.getStat().getCpRegen() : 0); + + // CP Recovery Rate while walking (num.) + packet.writeH(index++); + packet.writeD((_player.isMoving() && !_player.isRunning()) ? _player.getStat().getCpRegen() : 0); + + // CP Recovery Rate while running (%) + packet.writeH(index++); + packet.writeD(_player.isRunning() ? _player.getStat().getCpRegen() : 0); + + // CP Recovery Rate while running (num.) + packet.writeH(index++); + packet.writeD(_player.isRunning() ? _player.getStat().getCpRegen() : 0); + + // XXX Skill Cooldown Section + // P. Skill Cooldown (%) + packet.writeH(index++); + packet.writeD((int) _player.getStat().getReuseTypeValue(1) * 100); + + // M. Skill Cooldown (%) + packet.writeH(index++); + packet.writeD((int) _player.getStat().getReuseTypeValue(2) * 100); + + // Song/ Dance Cooldown (%) + packet.writeH(index++); + packet.writeD((int) _player.getStat().getReuseTypeValue(3) * 100); + + // XXX MP Consumption Section + // P. Skill MP Consumption Decrease (%) + packet.writeH(index++); + packet.writeD((int) _player.getStat().getMpConsumeTypeValue(1) * 100); + + // M. Skill MP Consumption Decrease (%) + packet.writeH(index++); + packet.writeD((int) _player.getStat().getMpConsumeTypeValue(2) * 100); + + // Song/ Dance MP Consumption Decrease (%) + packet.writeH(index++); + packet.writeD((int) _player.getStat().getMpConsumeTypeValue(3) * 100); + + // P. Skill MP Consumption Decrease (num.) + packet.writeH(index++); + packet.writeD((int) _player.getStat().getMpConsumeTypeValue(1) * 100); + + // M. Skill MP Consumption Decrease (num.) + packet.writeH(index++); + packet.writeD((int) _player.getStat().getMpConsumeTypeValue(2) * 100); + + // Song/ Dance MP Consumption Decrease (num.) + packet.writeH(index++); + packet.writeD((int) _player.getStat().getMpConsumeTypeValue(3) * 100); + + // XXX Anomalies Section + // Buff Cancel Resistance Bonus (%) + packet.writeH(index++); + packet.writeD((int) _player.getStat().getValue(Stat.RESIST_DISPEL_BUFF) * 100); + + // Debuff/ Anomaly Resistance Bonus (%) + packet.writeH(index++); + packet.writeD((int) _player.getStat().getValue(Stat.ABNORMAL_RESIST_MAGICAL) * 100); + + // Paralysis Atk. Rate (%) + packet.writeH(index++); + packet.writeD((int) _player.getStat().getAttackTrait(TraitType.PARALYZE) * 100); + + // Shock Atk. Rate (%) + packet.writeH(index++); + packet.writeD((int) _player.getStat().getAttackTrait(TraitType.SHOCK) * 100); + + // Knockback Atk. Rate (%) + packet.writeH(index++); + packet.writeD((int) _player.getStat().getAttackTrait(TraitType.KNOCKBACK) * 100); + + // Sleep Atk. Rate (%) + packet.writeH(index++); + packet.writeD((int) _player.getStat().getAttackTrait(TraitType.SLEEP) * 100); + + // Imprisonment Atk. Rate (%) + packet.writeH(index++); + packet.writeD((int) _player.getStat().getAttackTrait(TraitType.IMPRISON) * 100); + + // Pull Atk. Rate (%) + packet.writeH(index++); + packet.writeD((int) _player.getStat().getAttackTrait(TraitType.PULL) * 100); + + // Fear Atk. Rate (%) + packet.writeH(index++); + packet.writeD((int) _player.getStat().getAttackTrait(TraitType.FEAR) * 100); + + // Silence Atk. Rate (%) + packet.writeH(index++); + packet.writeD((int) _player.getStat().getAttackTrait(TraitType.SILENCE) * 100); + + // Hold Atk. Rate (%) + packet.writeH(index++); + packet.writeD((int) _player.getStat().getAttackTrait(TraitType.HOLD) * 100); + + // Suppression Atk. Rate (%) + packet.writeH(index++); + packet.writeD((int) _player.getStat().getAttackTrait(TraitType.SUPPRESSION) * 100); + + // Infection Atk. Rate (%) + packet.writeH(index++); + packet.writeD((int) _player.getStat().getAttackTrait(TraitType.INFECTION) * 100); + + // Paralysis Resistance (%) + packet.writeH(index++); + packet.writeD((int) _player.getStat().getDefenceTrait(TraitType.PARALYZE) * 100); + + // Shock Resistance (%) + packet.writeH(index++); + packet.writeD((int) _player.getStat().getDefenceTrait(TraitType.SHOCK) * 100); + + // Knockback Resistance (%) + packet.writeH(index++); + packet.writeD((int) _player.getStat().getDefenceTrait(TraitType.KNOCKBACK) * 100); + + // Sleep Resistance (%) + packet.writeH(index++); + packet.writeD((int) _player.getStat().getDefenceTrait(TraitType.SLEEP) * 100); + + // Imprisonment Resistance (%) + packet.writeH(index++); + packet.writeD((int) _player.getStat().getDefenceTrait(TraitType.IMPRISON) * 100); + + // Pull Resistance (%) + packet.writeH(index++); + packet.writeD((int) _player.getStat().getDefenceTrait(TraitType.PULL) * 100); + + // Fear Resistance (%) + packet.writeH(index++); + packet.writeD((int) _player.getStat().getDefenceTrait(TraitType.FEAR) * 100); + + // Silence Resistance (%) + packet.writeH(index++); + packet.writeD((int) _player.getStat().getDefenceTrait(TraitType.SLEEP) * 100); + + // Hold Resistance (%) + packet.writeH(index++); + packet.writeD((int) _player.getStat().getDefenceTrait(TraitType.HOLD) * 100); + + // Suppresion Resistance (%) + packet.writeH(index++); + packet.writeD((int) _player.getStat().getDefenceTrait(TraitType.SUPPRESSION) * 100); + + // Infection Resistance (%) + packet.writeH(index++); + packet.writeD((int) _player.getStat().getDefenceTrait(TraitType.INFECTION) * 100); + + return true; + } +} \ No newline at end of file diff --git a/L2J_Mobius_Essence_6.2_Vanguard/java/org/l2jmobius/gameserver/model/actor/Player.java b/L2J_Mobius_Essence_6.2_Vanguard/java/org/l2jmobius/gameserver/model/actor/Player.java index df8e68bf22..a9783b5947 100644 --- a/L2J_Mobius_Essence_6.2_Vanguard/java/org/l2jmobius/gameserver/model/actor/Player.java +++ b/L2J_Mobius_Essence_6.2_Vanguard/java/org/l2jmobius/gameserver/model/actor/Player.java @@ -337,6 +337,7 @@ import org.l2jmobius.gameserver.network.serverpackets.ExUserBoostStat; import org.l2jmobius.gameserver.network.serverpackets.ExUserInfoAbnormalVisualEffect; import org.l2jmobius.gameserver.network.serverpackets.ExUserInfoCubic; import org.l2jmobius.gameserver.network.serverpackets.ExUserInfoInvenWeight; +import org.l2jmobius.gameserver.network.serverpackets.ExUserViewInfoParameter; import org.l2jmobius.gameserver.network.serverpackets.ExVitalExInfo; import org.l2jmobius.gameserver.network.serverpackets.ExVitalityEffectInfo; import org.l2jmobius.gameserver.network.serverpackets.GetOnVehicle; @@ -4266,6 +4267,7 @@ public class Player extends Playable { // Send user info to the current player sendPacket(new UserInfo(this)); + sendPacket(new ExUserViewInfoParameter(this)); // Broadcast char info to known players broadcastCharInfo(); diff --git a/L2J_Mobius_Essence_6.2_Vanguard/java/org/l2jmobius/gameserver/network/serverpackets/ExUserViewInfoParameter.java b/L2J_Mobius_Essence_6.2_Vanguard/java/org/l2jmobius/gameserver/network/serverpackets/ExUserViewInfoParameter.java new file mode 100644 index 0000000000..3530b01bdd --- /dev/null +++ b/L2J_Mobius_Essence_6.2_Vanguard/java/org/l2jmobius/gameserver/network/serverpackets/ExUserViewInfoParameter.java @@ -0,0 +1,805 @@ +/* + * This file is part of the L2J Mobius project. + * + * 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 . + */ +package org.l2jmobius.gameserver.network.serverpackets; + +import org.l2jmobius.Config; +import org.l2jmobius.commons.network.PacketWriter; +import org.l2jmobius.gameserver.enums.ItemGrade; +import org.l2jmobius.gameserver.enums.ShotType; +import org.l2jmobius.gameserver.model.actor.Player; +import org.l2jmobius.gameserver.model.item.type.WeaponType; +import org.l2jmobius.gameserver.model.stats.Stat; +import org.l2jmobius.gameserver.model.stats.TraitType; +import org.l2jmobius.gameserver.network.OutgoingPackets; + +/** + * @author Mobius + */ +public class ExUserViewInfoParameter implements IClientOutgoingPacket +{ + private final Player _player; + + public ExUserViewInfoParameter(Player player) + { + _player = player; + } + + @Override + public boolean write(PacketWriter packet) + { + OutgoingPackets.EX_USER_VIEW_INFO_PARAMETER.writeId(packet); + + int index = 0; + + // Number of parameters. + packet.writeD(185); + + // XXX Attack Section + // P. Atk. (%) + packet.writeH(index++); + packet.writeD((_player.getPAtk() / Config.MAX_PATK) * 100); + + // P. Atk. (num.) + packet.writeH(index++); + packet.writeD(_player.getPAtk()); + + // M. Atk. (%) + packet.writeH(index++); + packet.writeD((_player.getMAtk() / Config.MAX_MATK) * 100); + + // M. Atk. (num) + packet.writeH(index++); + packet.writeD(_player.getMAtk()); + + // Soulshot Damage - Activation + packet.writeH(index++); + packet.writeD((_player.isChargedShot(ShotType.BLESSED_SOULSHOTS) || _player.isChargedShot(ShotType.SOULSHOTS)) ? (10000 + (_player.getActiveRubyJewel() != null ? (int) _player.getActiveRubyJewel().getBonus() * 1000 : 0)) : 0); + + // Spiritshot Damage - Activation + packet.writeH(index++); + packet.writeD((_player.isChargedShot(ShotType.BLESSED_SPIRITSHOTS) || _player.isChargedShot(ShotType.SPIRITSHOTS)) ? (10000 + (_player.getActiveShappireJewel() != null ? (int) _player.getActiveShappireJewel().getBonus() * 1000 : 0)) : 0); + + // Soulshot Damage - Enchanted Weapons + packet.writeH(index++); + packet.writeD((((_player.getActiveWeaponInstance() != null) && _player.getActiveWeaponInstance().isEnchanted()) ? (int) (_player.getActiveWeaponInstance().getEnchantLevel() * (_player.getActiveWeaponItem().getItemGrade() == ItemGrade.S ? 1.6 : _player.getActiveWeaponItem().getItemGrade() == ItemGrade.A ? 1.4 : _player.getActiveWeaponItem().getItemGrade() == ItemGrade.B ? 0.7 : _player.getActiveWeaponItem().getItemGrade().equals(ItemGrade.C) ? 0.4 : _player.getActiveWeaponItem().getItemGrade().equals(ItemGrade.D) ? 0.4 : 0) * 100) : 0)); + + // Spiritshot Damage - Enchanted Weapons + packet.writeH(index++); + packet.writeD((((_player.getActiveWeaponInstance() != null) && _player.getActiveWeaponInstance().isEnchanted()) ? (int) (_player.getActiveWeaponInstance().getEnchantLevel() * (_player.getActiveWeaponItem().getItemGrade() == ItemGrade.S ? 1.6 : _player.getActiveWeaponItem().getItemGrade() == ItemGrade.A ? 1.4 : _player.getActiveWeaponItem().getItemGrade() == ItemGrade.B ? 0.7 : _player.getActiveWeaponItem().getItemGrade().equals(ItemGrade.C) ? 0.4 : _player.getActiveWeaponItem().getItemGrade().equals(ItemGrade.D) ? 0.4 : 0) * 100) : 0)); + + // Soulshot Damage - Misc. + packet.writeH(index++); + packet.writeD(_player.getActiveRubyJewel() != null ? (int) _player.getActiveRubyJewel().getBonus() * 1000 : 0); + + // Spiritshot Damage - Misc. + packet.writeH(index++); + packet.writeD(_player.getActiveShappireJewel() != null ? (int) _player.getActiveShappireJewel().getBonus() * 1000 : 0); + + // Basic PvP Damage + packet.writeH(index++); + packet.writeD((int) _player.getStat().getValue(Stat.PVP_PHYSICAL_ATTACK_DAMAGE) * 100); + + // P. Skill Damage in PvP + packet.writeH(index++); + packet.writeD((int) _player.getStat().getValue(Stat.PVP_PHYSICAL_SKILL_DAMAGE) * 100); + + // M. Skill Damage in PvP + packet.writeH(index++); + packet.writeD((int) _player.getStat().getValue(Stat.PVP_MAGICAL_SKILL_DAMAGE) * 100); + + // Inflicted PvP Damage + packet.writeH(index++); + packet.writeD(0); + + // PvP Damage Decrease Ignore + packet.writeH(index++); + packet.writeD(0); + + // Basic PvE Damage + packet.writeH(index++); + packet.writeD((int) _player.getStat().getValue(Stat.PVE_PHYSICAL_ATTACK_DAMAGE) * 100); + + // P. Skill Damage in PvE + packet.writeH(index++); + packet.writeD((int) _player.getStat().getValue(Stat.PVE_PHYSICAL_SKILL_DAMAGE) * 100); + + // M. Skill Damage in PvE + packet.writeH(index++); + packet.writeD((int) _player.getStat().getValue(Stat.PVE_MAGICAL_SKILL_DAMAGE) * 100); + + // PvE Damage + packet.writeH(index++); + packet.writeD(0); + + // PvE Damage Decrease Ignore + packet.writeH(index++); + packet.writeD(0); + + // Basic Power + packet.writeH(index++); + packet.writeD(0); + + // P. Skill Power + packet.writeH(index++); + packet.writeD((int) _player.getStat().getValue(Stat.PHYSICAL_SKILL_POWER) * 100); + + // M. Skill Power + packet.writeH(index++); + packet.writeD((int) _player.getStat().getValue(Stat.MAGICAL_SKILL_POWER) * 100); + + // AoE Skill Damage + packet.writeH(index++); + packet.writeD(0); + + // Damage Bonus - Sword + packet.writeH(index++); + packet.writeD(((_player.getActiveWeaponInstance() != null) && (_player.getActiveWeaponInstance().getItemType() == WeaponType.SWORD)) ? _player.getStat().getWeaponBonusPAtk() : 0); + + // Damage Bonus - Ancient Sword + packet.writeH(index++); + packet.writeD((_player.getActiveWeaponInstance() != null) && (_player.getActiveWeaponInstance().getItemType() == WeaponType.ANCIENTSWORD) ? _player.getStat().getWeaponBonusPAtk() : 0); + + // Damage Bonus - Dagger + packet.writeH(index++); + packet.writeD((_player.getActiveWeaponInstance() != null) && (_player.getActiveWeaponInstance().getItemType() == WeaponType.DAGGER) ? _player.getStat().getWeaponBonusPAtk() : 0); + + // Damage Bonus - Rapier + packet.writeH(index++); + packet.writeD((_player.getActiveWeaponInstance() != null) && (_player.getActiveWeaponInstance().getItemType() == WeaponType.RAPIER) ? _player.getStat().getWeaponBonusPAtk() : 0); + + // Damage Bonus - Blunt Weapon + packet.writeH(index++); + packet.writeD((_player.getActiveWeaponInstance() != null) && ((_player.getActiveWeaponInstance().getItemType() == WeaponType.ETC) || (_player.getActiveWeaponInstance().getItemType() == WeaponType.BLUNT) || (_player.getActiveWeaponInstance().getItemType() == WeaponType.DUALBLUNT)) ? _player.getStat().getWeaponBonusPAtk() : 0); + + // Damage Bonus - Spear + packet.writeH(index++); + packet.writeD((_player.getActiveWeaponInstance() != null) && (_player.getActiveWeaponInstance().getItemType() == WeaponType.POLE) ? _player.getStat().getWeaponBonusPAtk() : 0); + + // Damage Bonus - Fists + packet.writeH(index++); + packet.writeD((_player.getActiveWeaponInstance() != null) && ((_player.getActiveWeaponInstance().getItemType() == WeaponType.FIST) || (_player.getActiveWeaponInstance().getItemType() == WeaponType.DUALFIST)) ? _player.getStat().getWeaponBonusPAtk() : 0); + + // Damage Bonus - Dual Swords + packet.writeH(index++); + packet.writeD((_player.getActiveWeaponInstance() != null) && (_player.getActiveWeaponInstance().getItemType() == WeaponType.DUAL) ? _player.getStat().getWeaponBonusPAtk() : 0); + + // Damage Bonus - Bow + packet.writeH(index++); + packet.writeD((_player.getActiveWeaponInstance() != null) && ((_player.getActiveWeaponInstance().getItemType() == WeaponType.BOW) || (_player.getActiveWeaponInstance().getItemType() == WeaponType.CROSSBOW) || (_player.getActiveWeaponInstance().getItemType() == WeaponType.TWOHANDCROSSBOW)) ? _player.getStat().getWeaponBonusPAtk() : 0); + + // Damage Bonus - Firearms + packet.writeH(index++); + packet.writeD((_player.getActiveWeaponInstance() != null) && (_player.getActiveWeaponInstance().getItemType() == WeaponType.PISTOLS) ? _player.getStat().getWeaponBonusPAtk() : 0); + + // XXX Defense Section + // P. Def. (%) + packet.writeH(index++); + packet.writeD((_player.getTemplate().getBasePDef() / _player.getPDef()) * 100); + + // P. Def. (num.) + packet.writeH(index++); + packet.writeD(_player.getPDef()); + + // M. Def. (%) + packet.writeH(index++); + packet.writeD((_player.getTemplate().getBaseMDef() / _player.getMDef()) * 100); + + // M. Def. (num.) + packet.writeH(index++); + packet.writeD(_player.getMDef()); + + // Soulshot Damage Resistance + packet.writeH(index++); + packet.writeD(0); + + // Spiritshot Damage Resistance + packet.writeH(index++); + packet.writeD(0); + + // Received basic PvP Damage + packet.writeH(index++); + packet.writeD(0); + + // Received P. Skill Damage in PvP + packet.writeH(index++); + packet.writeD(0); + + // Received M. Skill Damage in PvP + packet.writeH(index++); + packet.writeD(0); + + // Received PvP Damage + packet.writeH(index++); + packet.writeD((int) _player.getStat().getValue(Stat.PVP_DAMAGE_TAKEN)); + + // PvP Damage Decrease + packet.writeH(index++); + packet.writeD(0); + + // Received basic PvE Damage + packet.writeH(index++); + packet.writeD(0); + + // Received P. Skill Damage in PvE + packet.writeH(index++); + packet.writeD(0); + + // Received M. Skill Damage in PvE + packet.writeH(index++); + packet.writeD(0); + + // Received PvE Damage + packet.writeH(index++); + packet.writeD((int) _player.getStat().getValue(Stat.PVE_DAMAGE_TAKEN)); + + // PvE Damage Decrease + packet.writeH(index++); + packet.writeD(0); + + // Received basic damage power + packet.writeH(index++); + packet.writeD(0); + + // P. Skill Power when hit + packet.writeH(index++); + packet.writeD(0); + + // M. Skill Power when hit + packet.writeH(index++); + packet.writeD(0); + + // Received AoE Skill Damage + packet.writeH(index++); + packet.writeD(0); + + // Damage Resistance Bonus - Sword + packet.writeH(index++); + packet.writeD((int) _player.getStat().getDefenceTrait(TraitType.SWORD) * 100); + + // Damage Resistance Bonus - Ancient Sword + packet.writeH(index++); + packet.writeD((int) _player.getStat().getDefenceTrait(TraitType.ANCIENTSWORD) * 100); + + // Damage Resistance Bonus - Dagger + packet.writeH(index++); + packet.writeD((int) _player.getStat().getDefenceTrait(TraitType.DAGGER) * 100); + + // Damage Resistance Bonus - Rapier + packet.writeH(index++); + packet.writeD((int) _player.getStat().getDefenceTrait(TraitType.RAPIER) * 100); + + // Damage Resistance Bonus - Blunt Weapon + packet.writeH(index++); + packet.writeD((int) _player.getStat().getDefenceTrait(TraitType.BLUNT) * 100); + + // Damage Resistance Bonus - Spear + packet.writeH(index++); + packet.writeD((int) _player.getStat().getDefenceTrait(TraitType.POLE) * 100); + + // Damage Resistance Bonus - Fists + packet.writeH(index++); + packet.writeD((int) _player.getStat().getDefenceTrait(TraitType.FIST) * 100); + + // Damage Resistance Bonus - Dual Swords + packet.writeH(index++); + packet.writeD((int) _player.getStat().getDefenceTrait(TraitType.DUAL) * 100); + + // Damage Resistance Bonus - Bow + packet.writeH(index++); + packet.writeD((int) _player.getStat().getDefenceTrait(TraitType.BOW) * 100); + + // Damage Resistance Bonus - Firearms + packet.writeH(index++); + packet.writeD((int) _player.getStat().getDefenceTrait(TraitType.PISTOLS) * 100); + + // Shield Defense (%) + packet.writeH(index++); + // packet.writeD((_player.getStat().getShldDef() - _player.getShldDef()) / _player.getShldDef()); + packet.writeD(_player.getStat().getShldDef()); + + // Shield Defence (num.) + packet.writeH(index++); + packet.writeD(_player.getShldDef()); + + // Shield Defence Rate + packet.writeH(index++); + packet.writeD(_player.getStat().getShldDef()); + + // M. Damage Resistance (%) + packet.writeH(index++); + packet.writeD(0); + + // M. Damage Resistance (num.) + packet.writeH(index++); + packet.writeD(0); + + // M. Damage Reflection (%) + packet.writeH(index++); + packet.writeD(0); + + // M. Damage Reflection Resistance + packet.writeH(index++); + packet.writeD(0); + + // Received Fixed Damage (%) + packet.writeH(index++); + packet.writeD(0); + + // Casting Interruption Rate (%) + packet.writeH(index++); + packet.writeD(0); + + // Casting Interruption Rate (num.) + packet.writeH(index++); + packet.writeD(0); + + // XXX Accuracy Section + // P. Accuracy (%) + packet.writeH(index++); + packet.writeD(0); + + // P. Accuracy (num.) + packet.writeH(index++); + packet.writeD(_player.getAccuracy()); + + // M. Accuracy (%) + packet.writeH(index++); + packet.writeD(0); + + // M. Accuracy (num.) + packet.writeH(index++); + packet.writeD(_player.getMagicAccuracy()); + + // Vital Point Attack Rate (%) + packet.writeH(index++); + packet.writeD(0); + + // Vital Point Attack Rate (num.) + packet.writeH(index++); + packet.writeD(0); + + // XXX Evasion Section + // P. Evasion (%) + packet.writeH(index++); + packet.writeD(((_player.getEvasionRate() * 100) / Config.MAX_EVASION)); + + // P. Evasion (num.) + packet.writeH(index++); + packet.writeD(_player.getEvasionRate()); + + // M. Evasion (%) + packet.writeH(index++); + packet.writeD(((_player.getMagicEvasionRate() * 100) / Config.MAX_EVASION)); + + // M. Evasion (num.) + packet.writeH(index++); + packet.writeD(_player.getMagicEvasionRate()); + + // Received Vital Point Attack Rate (%) + packet.writeH(index++); + packet.writeD(0); + + // Received Vital Point Attack Rate (num.) + packet.writeH(index++); + packet.writeD(0); + + // P. Skill Evasion (%) + packet.writeH(index++); + packet.writeD(0); + + // M. Skill Evasion (%) + packet.writeH(index++); + packet.writeD(0); + + // XXX Speed Section + // Atk. Spd. (%) + packet.writeH(index++); + packet.writeD(((_player.getPAtkSpd() * 100) / Config.MAX_PATK_SPEED)); + + // Atk. Spd. (num.) + packet.writeH(index++); + packet.writeD(_player.getStat().getPAtkSpd()); + + // Casting Spd. (%) + packet.writeH(index++); + packet.writeD((_player.getMAtkSpd() * 100) / Config.MAX_MATK_SPEED); + + // Casting Spd. (num.) + packet.writeH(index++); + packet.writeD(_player.getStat().getMAtkSpd()); + + // Speed (%) + packet.writeH(index++); + packet.writeD((int) ((_player.getMoveSpeed() * 100) / Config.MAX_RUN_SPEED)); + + // Speed (num.) + packet.writeH(index++); + packet.writeD((int) _player.getStat().getMoveSpeed()); + + // XXX Critical Rate Section + // Basic Critical Rate (%) + packet.writeH(index++); + packet.writeD(_player.getStat().getCriticalHit()); + + // Basic Critical Rate (num.) + packet.writeH(index++); + packet.writeD(_player.getStat().getCriticalHit()); + + // P. Skill Critical Rate (%) + packet.writeH(index++); + packet.writeD(0); + + // P. Skill Critical Rate (num.) + packet.writeH(index++); + packet.writeD(0); + + // M. Skill Critical Rate (%) + packet.writeH(index++); + packet.writeD(0); + + // M. Skill Critical Rate (num.) + packet.writeH(index++); + packet.writeD(0); + + // Received basic Critical Rate (%) + packet.writeH(index++); + packet.writeD(0); + + // Received basic Critical Rate (num.) + packet.writeH(index++); + packet.writeD(0); + + // Received P. Skill Critical Rate (%) + packet.writeH(index++); + packet.writeD(0); + + // Received P. Skill Critical Rate (num.) + packet.writeH(index++); + packet.writeD(0); + + // Received M. Skill Critical Rate (%) + packet.writeH(index++); + packet.writeD(0); + + // Received M. Skill Critical Rate (num.) + packet.writeH(index++); + packet.writeD(0); + + // XXX Critical Damage Section + // Basic Critical Damage (%) + packet.writeH(index++); + packet.writeD((int) _player.getStat().getValue(Stat.CRITICAL_DAMAGE) * 100); + + // Basic Critical Damage (num.) + packet.writeH(index++); + packet.writeD((int) _player.getStat().getCriticalDmg(1) * 100); + + // P. Skill Critical Damage (%) + packet.writeH(index++); + packet.writeD(0); + + // P. Skill Critical Damage (num.) + packet.writeH(index++); + packet.writeD(0); + + // M. Skill Critical Damage (%) + packet.writeH(index++); + packet.writeD(0); + + // M. Skill Critical Damage (num.) + packet.writeH(index++); + packet.writeD(0); + + // Received Basic Critical Damage (%) + packet.writeH(index++); + packet.writeD(0); + + // Received Basic Critical Damage (num.) + packet.writeH(index++); + packet.writeD(0); + + // Received P. Skill Critical Damage (%) + packet.writeH(index++); + packet.writeD(0); + + // Received P. Skill Critical Damage (num.) + packet.writeH(index++); + packet.writeD(0); + + // Received M. Skill Critical Damage (%) + packet.writeH(index++); + packet.writeD(0); + + // Received M. Skill Critical Damage (num.) + packet.writeH(index++); + packet.writeD(0); + + // XXX Recovery Section + // HP ReCovery Potions' Effect (%) + packet.writeH(index++); + packet.writeD((int) _player.getStat().getValue(Stat.ADDITIONAL_POTION_HP) * 100); + + // HP Recovery Potions' Effect (num.) + packet.writeH(index++); + packet.writeD((int) _player.getStat().getValue(Stat.ADDITIONAL_POTION_HP) * 100); + + // MP Recovery Potions' Effect (%) + packet.writeH(index++); + packet.writeD((int) _player.getStat().getValue(Stat.ADDITIONAL_POTION_MP) * 100); + + // MP Recovery Potions' Effect (num.) + packet.writeH(index++); + packet.writeD((int) _player.getStat().getValue(Stat.ADDITIONAL_POTION_MP) * 100); + + // HP Recovery Rate (%) + packet.writeH(index++); + packet.writeD(_player.getStat().getHpRegen()); + + // HP Recovery Rate (num.) + packet.writeH(index++); + packet.writeD(_player.getStat().getHpRegen()); + + // HP Recovery Rate while standing (%) + packet.writeH(index++); + packet.writeD(!_player.isMoving() ? _player.getStat().getHpRegen() : 0); + + // HP Recovery Rate while standing (num.) + packet.writeH(index++); + packet.writeD(!_player.isMoving() ? _player.getStat().getHpRegen() : 0); + + // HP Recovery Rate while sitting (%) + packet.writeH(index++); + packet.writeD(_player.isSitting() ? _player.getStat().getHpRegen() : 0); + + // HP Recovery Rate while sitting (num.) + packet.writeH(index++); + packet.writeD(_player.isSitting() ? _player.getStat().getHpRegen() : 0); + + // HP Recovery Rate while walking (%) + packet.writeH(index++); + packet.writeD((_player.isMoving() && !_player.isRunning()) ? _player.getStat().getHpRegen() : 0); + + // HP Recovery Rate while walking (num.) + packet.writeH(index++); + packet.writeD((_player.isMoving() && !_player.isRunning()) ? _player.getStat().getHpRegen() : 0); + + // HP Recovery Rate while running (%) + packet.writeH(index++); + packet.writeD(_player.isRunning() ? _player.getStat().getHpRegen() : 0); + + // HP Recovery Rate while running (num.) + packet.writeH(index++); + packet.writeD(_player.isRunning() ? _player.getStat().getHpRegen() : 0); + + // MP Recovery Rate (%) + packet.writeH(index++); + packet.writeD(_player.getStat().getMpRegen()); + + // MP Recovery Rate (num.) + packet.writeH(index++); + packet.writeD(_player.getStat().getMpRegen()); + + // MP Recovery Rate while standing (%) + packet.writeH(index++); + packet.writeD(!_player.isMoving() ? _player.getStat().getMpRegen() : 0); + + // MP Recovery Rate while standing (num.) + packet.writeH(index++); + packet.writeD(!_player.isMoving() ? _player.getStat().getMpRegen() : 0); + + // MP Recovery Rate while sitting (%) + packet.writeH(index++); + packet.writeD(_player.isSitting() ? _player.getStat().getMpRegen() : 0); + + // MP Recovery Rate while sitting (num.) + packet.writeH(index++); + packet.writeD(_player.isSitting() ? _player.getStat().getMpRegen() : 0); + + // MP Recovery Rate while walking (%) + packet.writeH(index++); + packet.writeD((_player.isMoving() && !_player.isRunning()) ? _player.getStat().getMpRegen() : 0); + + // MP Recovery Rate while walking (num.) + packet.writeH(index++); + packet.writeD((_player.isMoving() && !_player.isRunning()) ? _player.getStat().getMpRegen() : 0); + + // MP Recovery Rate while running (%) + packet.writeH(index++); + packet.writeD(_player.isRunning() ? _player.getStat().getMpRegen() : 0); + + // MP Recovery Rate while running (num.) + packet.writeH(index++); + packet.writeD(_player.isRunning() ? _player.getStat().getMpRegen() : 0); + + // CP Recovery Rate (%) + packet.writeH(index++); + packet.writeD(_player.getStat().getCpRegen()); + + // CP Recovery Rate (num.) + packet.writeH(index++); + packet.writeD(_player.getStat().getCpRegen()); + + // CP Recovery Rate while standing (%) + packet.writeH(index++); + packet.writeD(!_player.isMoving() ? _player.getStat().getCpRegen() : 0); + + // CP Recovery Rate while standing (num.) + packet.writeH(index++); + packet.writeD(!_player.isMoving() ? _player.getStat().getCpRegen() : 0); + + // CP Recovery Rate while sitting (%) + packet.writeH(index++); + packet.writeD(_player.isSitting() ? _player.getStat().getCpRegen() : 0); + + // CP Recovery Rate while sitting (num.) + packet.writeH(index++); + packet.writeD(_player.isSitting() ? _player.getStat().getCpRegen() : 0); + + // CP Recovery Rate while walking (%) + packet.writeH(index++); + packet.writeD((_player.isMoving() && !_player.isRunning()) ? _player.getStat().getCpRegen() : 0); + + // CP Recovery Rate while walking (num.) + packet.writeH(index++); + packet.writeD((_player.isMoving() && !_player.isRunning()) ? _player.getStat().getCpRegen() : 0); + + // CP Recovery Rate while running (%) + packet.writeH(index++); + packet.writeD(_player.isRunning() ? _player.getStat().getCpRegen() : 0); + + // CP Recovery Rate while running (num.) + packet.writeH(index++); + packet.writeD(_player.isRunning() ? _player.getStat().getCpRegen() : 0); + + // XXX Skill Cooldown Section + // P. Skill Cooldown (%) + packet.writeH(index++); + packet.writeD((int) _player.getStat().getReuseTypeValue(1) * 100); + + // M. Skill Cooldown (%) + packet.writeH(index++); + packet.writeD((int) _player.getStat().getReuseTypeValue(2) * 100); + + // Song/ Dance Cooldown (%) + packet.writeH(index++); + packet.writeD((int) _player.getStat().getReuseTypeValue(3) * 100); + + // XXX MP Consumption Section + // P. Skill MP Consumption Decrease (%) + packet.writeH(index++); + packet.writeD((int) _player.getStat().getMpConsumeTypeValue(1) * 100); + + // M. Skill MP Consumption Decrease (%) + packet.writeH(index++); + packet.writeD((int) _player.getStat().getMpConsumeTypeValue(2) * 100); + + // Song/ Dance MP Consumption Decrease (%) + packet.writeH(index++); + packet.writeD((int) _player.getStat().getMpConsumeTypeValue(3) * 100); + + // P. Skill MP Consumption Decrease (num.) + packet.writeH(index++); + packet.writeD((int) _player.getStat().getMpConsumeTypeValue(1) * 100); + + // M. Skill MP Consumption Decrease (num.) + packet.writeH(index++); + packet.writeD((int) _player.getStat().getMpConsumeTypeValue(2) * 100); + + // Song/ Dance MP Consumption Decrease (num.) + packet.writeH(index++); + packet.writeD((int) _player.getStat().getMpConsumeTypeValue(3) * 100); + + // XXX Anomalies Section + // Buff Cancel Resistance Bonus (%) + packet.writeH(index++); + packet.writeD((int) _player.getStat().getValue(Stat.RESIST_DISPEL_BUFF) * 100); + + // Debuff/ Anomaly Resistance Bonus (%) + packet.writeH(index++); + packet.writeD((int) _player.getStat().getValue(Stat.ABNORMAL_RESIST_MAGICAL) * 100); + + // Paralysis Atk. Rate (%) + packet.writeH(index++); + packet.writeD((int) _player.getStat().getAttackTrait(TraitType.PARALYZE) * 100); + + // Shock Atk. Rate (%) + packet.writeH(index++); + packet.writeD((int) _player.getStat().getAttackTrait(TraitType.SHOCK) * 100); + + // Knockback Atk. Rate (%) + packet.writeH(index++); + packet.writeD((int) _player.getStat().getAttackTrait(TraitType.KNOCKBACK) * 100); + + // Sleep Atk. Rate (%) + packet.writeH(index++); + packet.writeD((int) _player.getStat().getAttackTrait(TraitType.SLEEP) * 100); + + // Imprisonment Atk. Rate (%) + packet.writeH(index++); + packet.writeD((int) _player.getStat().getAttackTrait(TraitType.IMPRISON) * 100); + + // Pull Atk. Rate (%) + packet.writeH(index++); + packet.writeD((int) _player.getStat().getAttackTrait(TraitType.PULL) * 100); + + // Fear Atk. Rate (%) + packet.writeH(index++); + packet.writeD((int) _player.getStat().getAttackTrait(TraitType.FEAR) * 100); + + // Silence Atk. Rate (%) + packet.writeH(index++); + packet.writeD((int) _player.getStat().getAttackTrait(TraitType.SILENCE) * 100); + + // Hold Atk. Rate (%) + packet.writeH(index++); + packet.writeD((int) _player.getStat().getAttackTrait(TraitType.HOLD) * 100); + + // Suppression Atk. Rate (%) + packet.writeH(index++); + packet.writeD((int) _player.getStat().getAttackTrait(TraitType.SUPPRESSION) * 100); + + // Infection Atk. Rate (%) + packet.writeH(index++); + packet.writeD((int) _player.getStat().getAttackTrait(TraitType.INFECTION) * 100); + + // Paralysis Resistance (%) + packet.writeH(index++); + packet.writeD((int) _player.getStat().getDefenceTrait(TraitType.PARALYZE) * 100); + + // Shock Resistance (%) + packet.writeH(index++); + packet.writeD((int) _player.getStat().getDefenceTrait(TraitType.SHOCK) * 100); + + // Knockback Resistance (%) + packet.writeH(index++); + packet.writeD((int) _player.getStat().getDefenceTrait(TraitType.KNOCKBACK) * 100); + + // Sleep Resistance (%) + packet.writeH(index++); + packet.writeD((int) _player.getStat().getDefenceTrait(TraitType.SLEEP) * 100); + + // Imprisonment Resistance (%) + packet.writeH(index++); + packet.writeD((int) _player.getStat().getDefenceTrait(TraitType.IMPRISON) * 100); + + // Pull Resistance (%) + packet.writeH(index++); + packet.writeD((int) _player.getStat().getDefenceTrait(TraitType.PULL) * 100); + + // Fear Resistance (%) + packet.writeH(index++); + packet.writeD((int) _player.getStat().getDefenceTrait(TraitType.FEAR) * 100); + + // Silence Resistance (%) + packet.writeH(index++); + packet.writeD((int) _player.getStat().getDefenceTrait(TraitType.SLEEP) * 100); + + // Hold Resistance (%) + packet.writeH(index++); + packet.writeD((int) _player.getStat().getDefenceTrait(TraitType.HOLD) * 100); + + // Suppresion Resistance (%) + packet.writeH(index++); + packet.writeD((int) _player.getStat().getDefenceTrait(TraitType.SUPPRESSION) * 100); + + // Infection Resistance (%) + packet.writeH(index++); + packet.writeD((int) _player.getStat().getDefenceTrait(TraitType.INFECTION) * 100); + + return true; + } +} \ No newline at end of file