/* * 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 com.l2jserver.gameserver.network.serverpackets; import com.l2jserver.Config; import com.l2jserver.gameserver.datatables.ClanTable; import com.l2jserver.gameserver.instancemanager.TownManager; import com.l2jserver.gameserver.model.L2Clan; import com.l2jserver.gameserver.model.actor.L2Character; import com.l2jserver.gameserver.model.actor.L2Npc; import com.l2jserver.gameserver.model.actor.L2Summon; import com.l2jserver.gameserver.model.actor.L2Trap; import com.l2jserver.gameserver.model.actor.instance.L2MonsterInstance; import com.l2jserver.gameserver.model.actor.instance.L2NpcInstance; import com.l2jserver.gameserver.model.actor.instance.L2PcInstance; import com.l2jserver.gameserver.skills.AbnormalEffect; /** * This class ... * * @version $Revision: 1.7.2.4.2.9 $ $Date: 2005/04/11 10:05:54 $ */ public abstract class AbstractNpcInfo extends L2GameServerPacket { // ddddddddddddddddddffffdddcccccSSddd dddddc // ddddddddddddddddddffffdddcccccSSddd dddddccffd private static final String _S__22_NPCINFO = "[S] 0c NpcInfo"; protected int _x, _y, _z, _heading; protected int _idTemplate; protected boolean _isAttackable, _isSummoned; protected int _mAtkSpd, _pAtkSpd; /** * Run speed, swimming run speed and flying run speed */ protected int _runSpd; /** * Walking speed, swimming walking speed and flying walking speed */ protected int _walkSpd; protected int _rhand, _lhand, _chest, _enchantEffect; protected double _collisionHeight, _collisionRadius; protected String _name = ""; protected String _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().baseRunSpd; _walkSpd = cha.getTemplate().baseWalkSpd; } /* (non-Javadoc) * @see com.l2jserver.gameserver.serverpackets.ServerBasePacket#getType() */ @Override public String getType() { return _S__22_NPCINFO; } /** * Packet for Npcs */ public static class NpcInfo extends AbstractNpcInfo { private L2Npc _npc; private int _clanCrest = 0; private int _allyCrest = 0; private int _allyId = 0; private int _clanId = 0; private int _displayEffect = 0; public NpcInfo(L2Npc cha, L2Character attacker) { super(cha); _npc = cha; _idTemplate = cha.getTemplate().idTemplate; // On every subclass _rhand = cha.getRightHandItem(); // On every subclass _lhand = cha.getLeftHandItem(); // On every subclass _enchantEffect = cha.getEnchantEffect(); _collisionHeight = cha.getCollisionHeight();// On every subclass _collisionRadius = cha.getCollisionRadius();// On every subclass _isAttackable = cha.isAutoAttackable(attacker); if (cha.getTemplate().serverSideName) _name = cha.getName();// On every subclass if (Config.L2JMOD_CHAMPION_ENABLE && cha.isChampion()) _title = (Config.L2JMOD_CHAMP_TITLE); // On every subclass else if (cha.getTemplate().serverSideTitle) _title = cha.getTemplate().title; // On every subclass else _title = cha.getTitle(); // On every subclass if (Config.SHOW_NPC_LVL && _npc instanceof L2MonsterInstance) { String t = "Lv " + cha.getLevel() + (cha.getAggroRange() > 0 ? "*" : ""); if (_title != null) t += " " + _title; _title = t; } // npc crest of owning clan/ally of castle if (cha instanceof L2NpcInstance && cha.isInsideZone(L2Character.ZONE_TOWN) && (Config.SHOW_CREST_WITHOUT_QUEST || cha.getCastle().getShowNpcCrest()) && cha.getCastle().getOwnerId() != 0) { int townId = TownManager.getTown(_x, _y, _z).getTownId(); if (townId != 33 && townId != 22) { L2Clan clan = ClanTable.getInstance().getClan(cha.getCastle().getOwnerId()); _clanCrest = clan.getCrestId(); _clanId = clan.getClanId(); _allyCrest = clan.getAllyCrestId(); _allyId = clan.getAllyId(); } } _displayEffect = cha.getDisplayEffect(); } @Override protected void writeImpl() { writeC(0x0c); writeD(_npc.getObjectId()); writeD(_idTemplate + 1000000); // npctype id writeD(_isAttackable ? 1 : 0); writeD(_x); writeD(_y); writeD(_z); writeD(_heading); writeD(0x00); writeD(_mAtkSpd); writeD(_pAtkSpd); writeD(_runSpd); writeD(_walkSpd); writeD(_runSpd); // swim run speed writeD(_walkSpd); // swim walk speed writeD(_runSpd); // swim run speed writeD(_walkSpd); // swim walk speed writeD(_runSpd); // fly run speed writeD(_walkSpd); // fly run speed writeF(_npc.getMovementSpeedMultiplier()); writeF(_npc.getAttackSpeedMultiplier()); writeF(_collisionRadius); writeF(_collisionHeight); writeD(_rhand); // right hand weapon writeD(_chest); writeD(_lhand); // left hand weapon writeC(1); // name above char 1=true ... ?? writeC(_npc.isRunning() ? 1 : 0); writeC(_npc.isInCombat() ? 1 : 0); writeC(_npc.isAlikeDead() ? 1 : 0); writeC(_isSummoned ? 2 : 0); // 0=teleported 1=default 2=summoned writeS(_name); writeS(_title); writeD(0x00); // Title color 0=client default writeD(0x00); //pvp flag writeD(0x00); // karma writeD(_npc.getAbnormalEffect()); // C2 writeD(_clanId); //clan id writeD(_clanCrest); //crest id writeD(_allyId); // ally id writeD(_allyCrest); // all crest writeC(_npc.isFlying() ? 2 : 0); // C2 writeC(0x00); // title color 0=client writeF(_collisionRadius); writeF(_collisionHeight); writeD(_enchantEffect); // C4 writeD(_npc.isFlying() ? 1 : 0); // C6 writeD(0x00); writeD(_npc.getColorEffect());// CT1.5 Pet form and skills, Color effect writeC(_npc.isHideName() ? 0x00 : 0x01); writeC(_npc.isHideName() ? 0x00 : 0x01); writeD(_npc.getSpecialEffect()); writeD(_displayEffect); } } public static class TrapInfo extends AbstractNpcInfo { private L2Trap _trap; public TrapInfo(L2Trap cha, L2Character attacker) { super(cha); _trap = cha; _idTemplate = cha.getTemplate().idTemplate; _isAttackable = cha.isAutoAttackable(attacker); _rhand = 0; _lhand = 0; _collisionHeight = _trap.getTemplate().fCollisionHeight; _collisionRadius = _trap.getTemplate().fCollisionRadius; if (cha.getTemplate().serverSideName) _name = cha.getName(); _title = cha.getOwner() != null ? cha.getOwner().getName() : ""; _runSpd = _trap.getRunSpeed(); _walkSpd = _trap.getWalkSpeed(); } @Override protected void writeImpl() { writeC(0x0c); writeD(_trap.getObjectId()); writeD(_idTemplate + 1000000); // npctype id writeD(_isAttackable ? 1 : 0); writeD(_x); writeD(_y); writeD(_z); writeD(_heading); writeD(0x00); writeD(_mAtkSpd); writeD(_pAtkSpd); writeD(_runSpd); writeD(_walkSpd); writeD(_runSpd); // swim run speed writeD(_walkSpd); // swim walk speed writeD(_runSpd); // fly run speed writeD(_walkSpd); // fly walk speed writeD(_runSpd); // fly run speed writeD(_walkSpd); // fly walk speed writeF(_trap.getMovementSpeedMultiplier()); writeF(_trap.getAttackSpeedMultiplier()); writeF(_collisionRadius); writeF(_collisionHeight); writeD(_rhand); // right hand weapon writeD(_chest); writeD(_lhand); // left hand weapon writeC(1); // name above char 1=true ... ?? writeC(1); writeC(_trap.isInCombat() ? 1 : 0); writeC(_trap.isAlikeDead() ? 1 : 0); writeC(_isSummoned ? 2 : 0); // 0=teleported 1=default 2=summoned writeS(_name); writeS(_title); writeD(0x00); // title color 0 = client default writeD(_trap.getPvpFlag()); writeD(_trap.getKarma()); writeD(_trap.getAbnormalEffect()); // C2 writeD(0x00); //clan id writeD(0x00); //crest id writeD(0000); // C2 writeD(0000); // C2 writeC(0000); // C2 writeC(0x00); // Title color 0=client default writeF(_collisionRadius); writeF(_collisionHeight); writeD(0x00); // C4 writeD(0x00); // C6 writeD(0x00); writeD(0);//CT1.5 Pet form and skills writeC(0x01); writeC(0x01); writeD(0x00); } } /** * Packet for summons */ public static class SummonInfo extends AbstractNpcInfo { private L2Summon _summon; private int _form = 0; private int _val = 0; public SummonInfo(L2Summon cha, L2Character attacker, int val) { super(cha); _summon = cha; _val = val; if (_summon.isShowSummonAnimation()) _val = 2; //override for spawn int npcId = cha.getTemplate().npcId; if (npcId == 16041 || npcId == 16042) { if (cha.getLevel() > 84) _form = 3; else if (cha.getLevel() > 79) _form = 2; else if (cha.getLevel() > 74) _form = 1; } else if (npcId == 16025 || npcId == 16037) { if (cha.getLevel() > 69) _form = 3; else if (cha.getLevel() > 64) _form = 2; else if (cha.getLevel() > 59) _form = 1; } // fields not set on AbstractNpcInfo _isAttackable = cha.isAutoAttackable(attacker); _rhand = cha.getWeapon(); _lhand = 0; _chest = cha.getArmor(); _enchantEffect = cha.getTemplate().enchantEffect; _name = cha.getName(); _title = cha.getOwner() != null ? ((!cha.getOwner().isOnline()) ? "" : cha.getOwner().getName()) : ""; // when owner online, summon will show in title owner name _idTemplate = cha.getTemplate().idTemplate; _collisionHeight = cha.getTemplate().fCollisionHeight; _collisionRadius = cha.getTemplate().fCollisionRadius; _invisible = cha.getOwner() != null ? cha.getOwner().getAppearance().getInvisible() : false; } @Override protected void writeImpl() { boolean gmSeeInvis = false; if (_invisible) { L2PcInstance tmp = getClient().getActiveChar(); if (tmp != null && tmp.isGM()) gmSeeInvis = true; } writeC(0x0c); writeD(_summon.getObjectId()); writeD(_idTemplate + 1000000); // npctype id writeD(_isAttackable ? 1 : 0); writeD(_x); writeD(_y); writeD(_z); writeD(_heading); writeD(0x00); writeD(_mAtkSpd); writeD(_pAtkSpd); writeD(_runSpd); writeD(_walkSpd); writeD(_runSpd); // swim run speed writeD(_walkSpd); // swim walk speed writeD(_runSpd); // fly run speed writeD(_walkSpd); // fly walk speed writeD(_runSpd); // fly run speed writeD(_walkSpd); // fly walk speed writeF(_summon.getMovementSpeedMultiplier()); writeF(_summon.getAttackSpeedMultiplier()); writeF(_collisionRadius); writeF(_collisionHeight); writeD(_rhand); // right hand weapon writeD(_chest); writeD(_lhand); // left hand weapon writeC(1); // name above char 1=true ... ?? writeC(1); // always running 1=running 0=walking writeC(_summon.isInCombat() ? 1 : 0); writeC(_summon.isAlikeDead() ? 1 : 0); writeC(_val); // 0=teleported 1=default 2=summoned writeS(_name); writeS(_title); writeD(0x01);// Title color 0=client default writeD(_summon.getPvpFlag()); writeD(_summon.getKarma()); writeD(gmSeeInvis ? _summon.getAbnormalEffect() | AbnormalEffect.STEALTH.getMask() : _summon.getAbnormalEffect()); writeD(0x00); //clan id writeD(0x00); //crest id writeD(0000); // C2 writeD(0000); // C2 writeC(0000); // C2 writeC(_summon.getTeam());// Title color 0=client default writeF(_collisionRadius); writeF(_collisionHeight); writeD(_enchantEffect); // C4 writeD(0x00); // C6 writeD(0x00); writeD(_form); //CT1.5 Pet form and skills writeC(0x01); writeC(0x01); writeD(_summon.getSpecialEffect()); } } }