/* * This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the * Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that * it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If * not, see <http://www.gnu.org/licenses/>. */ package silentium.gameserver.network.serverpackets; import silentium.gameserver.configs.NPCConfig; import silentium.gameserver.model.L2Clan; import silentium.gameserver.model.actor.L2Character; import silentium.gameserver.model.actor.L2Npc; import silentium.gameserver.model.actor.L2Summon; import silentium.gameserver.model.actor.instance.L2MonsterInstance; import silentium.gameserver.model.actor.instance.L2NpcInstance; import silentium.gameserver.model.actor.instance.L2PcInstance; import silentium.gameserver.model.actor.instance.L2PetInstance; import silentium.gameserver.tables.ClanTable; import silentium.gameserver.templates.chars.L2NpcTemplate; public abstract class AbstractNpcInfo extends L2GameServerPacket { protected int _x, _y, _z, _heading; protected int _idTemplate; protected boolean _isAttackable, _isSummoned; protected int _mAtkSpd, _pAtkSpd; protected int _runSpd, _walkSpd; protected int _rhand, _lhand, _chest, _enchantEffect; protected double _collisionHeight, _collisionRadius; protected int _clanCrest, _allyCrest, _allyId, _clanId; protected String _name = "", _title = ""; public AbstractNpcInfo(L2Character cha) { _isSummoned = cha.isShowSummonAnimation(); _x = cha.getX(); _y = cha.getY(); _z = cha.getZ(); _heading = cha.getHeading(); _mAtkSpd = cha.getMAtkSpd(); _pAtkSpd = cha.getPAtkSpd(); _runSpd = cha.getTemplate().getBaseRunSpd(); _walkSpd = cha.getTemplate().getBaseWalkSpd(); } /** * Packet for Npcs */ public static class NpcInfo extends AbstractNpcInfo { private final L2Npc _npc; public NpcInfo(L2Npc cha, L2Character attacker) { super(cha); _npc = cha; _idTemplate = _npc.getTemplate().getIdTemplate(); _rhand = _npc.getRightHandItem(); _lhand = _npc.getLeftHandItem(); _enchantEffect = _npc.getEnchantEffect(); _collisionHeight = _npc.getCollisionHeight(); _collisionRadius = _npc.getCollisionRadius(); _isAttackable = _npc.isAutoAttackable(attacker); if (_npc.getTemplate().isServerSideName()) _name = _npc.getTemplate().getName(); if (NPCConfig.CHAMPION_ENABLE && _npc.isChampion()) _title = ("Champion"); else if (_npc.getTemplate().isServerSideTitle()) _title = _npc.getTemplate().getTitle(); else _title = _npc.getTitle(); if (NPCConfig.SHOW_NPC_LVL && _npc instanceof L2MonsterInstance) { String t = "Lv " + _npc.getLevel() + (_npc.getAggroRange() > 0 ? "*" : ""); if (_title != null) t += " " + _title; _title = t; } // NPC crest system if (NPCConfig.SHOW_NPC_CREST && _npc instanceof L2NpcInstance && _npc.isInsideZone(L2Character.ZONE_TOWN) && _npc.getCastle().getOwnerId() != 0) { L2Clan clan = ClanTable.getInstance().getClan(_npc.getCastle().getOwnerId()); _clanCrest = clan.getCrestId(); _clanId = clan.getClanId(); _allyCrest = clan.getAllyCrestId(); _allyId = clan.getAllyId(); } } @Override protected void writeImpl() { writeC(0x16); writeD(_npc.getObjectId()); writeD(_idTemplate + 1000000); writeD(_isAttackable ? 1 : 0); writeD(_x); writeD(_y); writeD(_z); writeD(_heading); writeD(0x00); writeD(_mAtkSpd); writeD(_pAtkSpd); writeD(_runSpd); writeD(_walkSpd); writeD(_runSpd); writeD(_walkSpd); writeD(_runSpd); writeD(_walkSpd); writeD(_runSpd); writeD(_walkSpd); writeF(_npc.getStat().getMovementSpeedMultiplier()); writeF(_npc.getStat().getAttackSpeedMultiplier()); writeF(_collisionRadius); writeF(_collisionHeight); writeD(_rhand); writeD(_chest); writeD(_lhand); writeC(1); // name above char writeC(_npc.isRunning() ? 1 : 0); writeC(_npc.isInCombat() ? 1 : 0); writeC(_npc.isAlikeDead() ? 1 : 0); writeC(_isSummoned ? 2 : 0); writeS(_name); writeS(_title); writeD(0x00); writeD(0x00); writeD(0x00); writeD(_npc.getAbnormalEffect()); writeD(_clanId); writeD(_clanCrest); writeD(_allyId); writeD(_allyCrest); writeC(_npc.isFlying() ? 2 : 0); writeC(0x00); writeF(_collisionRadius); writeF(_collisionHeight); writeD(_enchantEffect); writeD(_npc.isFlying() ? 1 : 0); } } /** * Packet for summons */ public static class SummonInfo extends AbstractNpcInfo { private final L2Summon _summon; private final L2PcInstance _owner; private int _summonAnimation = 0; public SummonInfo(L2Summon cha, L2PcInstance attacker, int val) { super(cha); _summon = cha; _owner = _summon.getOwner(); _summonAnimation = val; if (_summon.isShowSummonAnimation()) _summonAnimation = 2; // override for spawn _isAttackable = _summon.isAutoAttackable(attacker); _rhand = _summon.getWeapon(); _lhand = 0; _chest = _summon.getArmor(); _enchantEffect = _summon.getTemplate().getEnchantEffect(); _name = _summon.getName(); _title = _owner != null ? (!_owner.isOnline() ? "" : _owner.getName()) : ""; _idTemplate = _summon.getTemplate().getIdTemplate(); _collisionHeight = _summon.getTemplate().getCollisionHeight(); _collisionRadius = _summon.getTemplate().getCollisionRadius(); // NPC crest system if (NPCConfig.SHOW_SUMMON_CREST && _owner != null && _owner.getClan() != null) { L2Clan clan = ClanTable.getInstance().getClan(_owner.getClanId()); _clanCrest = clan.getCrestId(); _clanId = clan.getClanId(); _allyCrest = clan.getAllyCrestId(); _allyId = clan.getAllyId(); } } @Override protected void writeImpl() { if (_owner != null && _owner.getAppearance().getInvisible()) return; writeC(0x16); writeD(_summon.getObjectId()); writeD(_idTemplate + 1000000); writeD(_isAttackable ? 1 : 0); writeD(_x); writeD(_y); writeD(_z); writeD(_heading); writeD(0x00); writeD(_mAtkSpd); writeD(_pAtkSpd); writeD(_runSpd); writeD(_walkSpd); writeD(_runSpd); writeD(_walkSpd); writeD(_runSpd); writeD(_walkSpd); writeD(_runSpd); writeD(_walkSpd); writeF(_summon.getStat().getMovementSpeedMultiplier()); writeF(_summon.getStat().getAttackSpeedMultiplier()); writeF(_collisionRadius); writeF(_collisionHeight); writeD(_rhand); writeD(_chest); writeD(_lhand); writeC(1); // name above char writeC(_summon.isRunning() ? 1 : 0); writeC(_summon.isInCombat() ? 1 : 0); writeC(_summon.isAlikeDead() ? 1 : 0); writeC(_summonAnimation); writeS(_name); writeS(_title); writeD(_summon instanceof L2PetInstance ? 0x00 : 0x01); writeD(_summon.getPvpFlag()); writeD(_summon.getKarma()); writeD(_summon.getAbnormalEffect()); writeD(_clanId); writeD(_clanCrest); writeD(_allyId); writeD(_allyCrest); writeC(0x00); writeC(_summon.getTeam()); writeF(_collisionRadius); writeF(_collisionHeight); writeD(_enchantEffect); writeD(0x00); } } /** * Packet for morphed PCs */ public static class PcMorphInfo extends AbstractNpcInfo { private final L2PcInstance _pc; private final L2NpcTemplate _template; public PcMorphInfo(L2PcInstance cha, L2NpcTemplate template) { super(cha); _pc = cha; _template = template; _rhand = _template.getRightHand(); _lhand = _template.getLeftHand(); _collisionHeight = _template.getCollisionHeight(); _collisionRadius = _template.getCollisionRadius(); _enchantEffect = _template.getEnchantEffect(); } @Override protected void writeImpl() { writeC(0x16); writeD(_pc.getObjectId()); writeD(_pc.getPoly().getPolyId() + 1000000); writeD(1); writeD(_x); writeD(_y); writeD(_z); writeD(_heading); writeD(0x00); writeD(_mAtkSpd); writeD(_pAtkSpd); writeD(_runSpd); writeD(_walkSpd); writeD(_runSpd); writeD(_walkSpd); writeD(_runSpd); writeD(_walkSpd); writeD(_runSpd); writeD(_walkSpd); writeF(_pc.getStat().getMovementSpeedMultiplier()); writeF(_pc.getStat().getAttackSpeedMultiplier()); writeF(_collisionRadius); writeF(_collisionHeight); writeD(_rhand); writeD(0); writeD(_lhand); writeC(1); // name above char writeC(_pc.isRunning() ? 1 : 0); writeC(_pc.isInCombat() ? 1 : 0); writeC(_pc.isAlikeDead() ? 1 : 0); writeC(0); // 0 = teleported, 1 = default, 2 = summoned writeS(_name); writeS(_title); writeD(0x00); writeD(0x00); writeD(0x00); writeD(_pc.getAbnormalEffect()); writeD(0x00); writeD(0x00); writeD(0x00); writeD(0x00); writeC(0x00); writeC(0x00); writeF(_collisionRadius); writeF(_collisionHeight); writeD(_enchantEffect); writeD(0x00); } } }