/*
* 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);
}
}
}