123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396 |
- /*
- * Copyright (C) 2004-2015 L2J Server
- *
- * This file is part of L2J Server.
- *
- * L2J Server is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * L2J Server is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
- package com.l2jserver.gameserver.network.serverpackets;
- import com.l2jserver.Config;
- import com.l2jserver.gameserver.data.sql.impl.ClanTable;
- import com.l2jserver.gameserver.instancemanager.TownManager;
- import com.l2jserver.gameserver.model.L2Clan;
- import com.l2jserver.gameserver.model.PcCondOverride;
- 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.instance.L2MonsterInstance;
- import com.l2jserver.gameserver.model.actor.instance.L2NpcInstance;
- import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
- import com.l2jserver.gameserver.model.actor.instance.L2TrapInstance;
- import com.l2jserver.gameserver.model.skills.AbnormalVisualEffect;
- import com.l2jserver.gameserver.model.zone.ZoneId;
- public abstract class AbstractNpcInfo extends L2GameServerPacket
- {
- protected int _x, _y, _z, _heading;
- protected int _idTemplate;
- protected boolean _isAttackable, _isSummoned;
- protected int _mAtkSpd, _pAtkSpd;
- protected final int _runSpd, _walkSpd;
- protected final int _swimRunSpd, _swimWalkSpd;
- protected final int _flyRunSpd, _flyWalkSpd;
- protected double _moveMultiplier;
-
- 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();
- _moveMultiplier = cha.getMovementSpeedMultiplier();
- _runSpd = (int) Math.round(cha.getRunSpeed() / _moveMultiplier);
- _walkSpd = (int) Math.round(cha.getWalkSpeed() / _moveMultiplier);
- _swimRunSpd = (int) Math.round(cha.getSwimRunSpeed() / _moveMultiplier);
- _swimWalkSpd = (int) Math.round(cha.getSwimWalkSpeed() / _moveMultiplier);
- _flyRunSpd = cha.isFlying() ? _runSpd : 0;
- _flyWalkSpd = cha.isFlying() ? _walkSpd : 0;
- }
-
- /**
- * Packet for Npcs
- */
- public static class NpcInfo extends AbstractNpcInfo
- {
- private final 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().getDisplayId(); // 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().isUsingServerSideName())
- {
- _name = cha.getName();// On every subclass
- }
-
- if (_npc.isInvisible())
- {
- _title = "Invisible";
- }
- else if (Config.L2JMOD_CHAMPION_ENABLE && cha.isChampion())
- {
- _title = (Config.L2JMOD_CHAMP_TITLE); // On every subclass
- }
- else if (cha.getTemplate().isUsingServerSideTitle())
- {
- _title = cha.getTemplate().getTitle(); // On every subclass
- }
- else
- {
- _title = cha.getTitle(); // On every subclass
- }
-
- if (Config.SHOW_NPC_LVL && (_npc instanceof L2MonsterInstance))
- {
- String t = "Lv " + cha.getLevel() + (cha.isAggressive() ? "*" : "");
- if (_title != null)
- {
- t += " " + _title;
- }
-
- _title = t;
- }
-
- // npc crest of owning clan/ally of castle
- if ((cha instanceof L2NpcInstance) && cha.isInsideZone(ZoneId.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.getId();
- _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(_swimRunSpd);
- writeD(_swimWalkSpd);
- writeD(_flyRunSpd);
- writeD(_flyWalkSpd);
- writeD(_flyRunSpd);
- writeD(_flyWalkSpd);
- writeF(_moveMultiplier);
- 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); // invisible ?? 0=false 1=true 2=summoned (only works if model has a summon animation)
- writeD(-1); // High Five NPCString ID
- writeS(_name);
- writeD(-1); // High Five NPCString ID
- writeS(_title);
- writeD(0x00); // Title color 0=client default
- writeD(0x00); // pvp flag
- writeD(0x00); // karma
-
- writeD(_npc.isInvisible() ? _npc.getAbnormalVisualEffects() | AbnormalVisualEffect.STEALTH.getMask() : _npc.getAbnormalVisualEffects());
- writeD(_clanId); // clan id
- writeD(_clanCrest); // crest id
- writeD(_allyId); // ally id
- writeD(_allyCrest); // all crest
-
- writeC(_npc.isInsideZone(ZoneId.WATER) ? 1 : _npc.isFlying() ? 2 : 0); // C2
- writeC(_npc.getTeam().getId());
-
- 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.isTargetable() ? 0x01 : 0x00);
- writeC(_npc.isShowName() ? 0x01 : 0x00);
- writeD(_npc.getAbnormalVisualEffectSpecial());
- writeD(_displayEffect);
- }
- }
-
- public static class TrapInfo extends AbstractNpcInfo
- {
- private final L2TrapInstance _trap;
-
- public TrapInfo(L2TrapInstance cha, L2Character attacker)
- {
- super(cha);
-
- _trap = cha;
- _idTemplate = cha.getTemplate().getDisplayId();
- _isAttackable = cha.isAutoAttackable(attacker);
- _rhand = 0;
- _lhand = 0;
- _collisionHeight = _trap.getTemplate().getfCollisionHeight();
- _collisionRadius = _trap.getTemplate().getfCollisionRadius();
- if (cha.getTemplate().isUsingServerSideName())
- {
- _name = cha.getName();
- }
- _title = cha.getOwner() != null ? cha.getOwner().getName() : "";
- }
-
- @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(_swimRunSpd);
- writeD(_swimWalkSpd);
- writeD(_flyRunSpd);
- writeD(_flyWalkSpd);
- writeD(_flyRunSpd);
- writeD(_flyWalkSpd);
- writeF(_moveMultiplier);
- 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); // invisible ?? 0=false 1=true 2=summoned (only works if model has a summon animation)
- writeD(-1); // High Five NPCString ID
- writeS(_name);
- writeD(-1); // High Five NPCString ID
- writeS(_title);
- writeD(0x00); // title color 0 = client default
-
- writeD(_trap.getPvpFlag());
- writeD(_trap.getKarma());
-
- writeD(_trap.isInvisible() ? _trap.getAbnormalVisualEffects() | AbnormalVisualEffect.STEALTH.getMask() : _trap.getAbnormalVisualEffects());
- writeD(0x00); // clan id
- writeD(0x00); // crest id
- writeD(0000); // C2
- writeD(0000); // C2
- writeC(0000); // C2
-
- writeC(_trap.getTeam().getId());
-
- 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 final L2Summon _summon;
- private final int _form;
- private final int _val;
-
- public SummonInfo(L2Summon cha, L2Character attacker, int val)
- {
- super(cha);
- _summon = cha;
- _val = val;
- _form = cha.getFormId();
-
- _isAttackable = cha.isAutoAttackable(attacker);
- _rhand = cha.getWeapon();
- _lhand = 0;
- _chest = cha.getArmor();
- _enchantEffect = cha.getTemplate().getWeaponEnchant();
- _name = cha.getName();
- _title = (cha.getOwner() != null) && cha.getOwner().isOnline() ? cha.getOwner().getName() : "";
- _idTemplate = cha.getTemplate().getDisplayId();
- _collisionHeight = cha.getTemplate().getfCollisionHeight();
- _collisionRadius = cha.getTemplate().getfCollisionRadius();
- setInvisible(cha.isInvisible());
- }
-
- @Override
- protected void writeImpl()
- {
- boolean gmSeeInvis = false;
- if (isInvisible())
- {
- final L2PcInstance activeChar = getClient().getActiveChar();
- if ((activeChar != null) && activeChar.canOverrideCond(PcCondOverride.SEE_ALL_PLAYERS))
- {
- 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(_swimRunSpd);
- writeD(_swimWalkSpd);
- writeD(_flyRunSpd);
- writeD(_flyWalkSpd);
- writeD(_flyRunSpd);
- writeD(_flyWalkSpd);
- writeF(_moveMultiplier);
- writeF(_summon.getAttackSpeedMultiplier());
- writeF(_collisionRadius);
- writeF(_collisionHeight);
- writeD(_rhand); // right hand weapon
- writeD(_chest);
- writeD(_lhand); // left hand weapon
- writeC(0x01); // name above char 1=true ... ??
- writeC(0x01); // always running 1=running 0=walking
- writeC(_summon.isInCombat() ? 1 : 0);
- writeC(_summon.isAlikeDead() ? 1 : 0);
- writeC(_val); // invisible ?? 0=false 1=true 2=summoned (only works if model has a summon animation)
- writeD(-1); // High Five NPCString ID
- writeS(_name);
- writeD(-1); // High Five NPCString ID
- writeS(_title);
- writeD(0x01);// Title color 0=client default
-
- writeD(_summon.getPvpFlag());
- writeD(_summon.getKarma());
-
- writeD(gmSeeInvis ? _summon.getAbnormalVisualEffects() | AbnormalVisualEffect.STEALTH.getMask() : _summon.getAbnormalVisualEffects());
-
- writeD(0x00); // clan id
- writeD(0x00); // crest id
- writeD(0x00); // C2
- writeD(0x00); // C2
- writeC(_summon.isInsideZone(ZoneId.WATER) ? 1 : _summon.isFlying() ? 2 : 0); // C2
-
- writeC(_summon.getTeam().getId());
-
- 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.getAbnormalVisualEffectSpecial());
- }
- }
- }
|