P1ckw1ck 158 Опубликовано 30 апреля, 2015 (изменено) Добрый вечер. Есть гварды для гве по фракции. но они чуток не так работают. Они не сразу агрятся на противоположного играка фракции а через 2-3 секунды. И нет полоски здоровья. Мб есть люди которые поажут где косят в коде. Сам код. Буду благодарен. package net.sf.l2j.gameserver.model.actor.instance; import net.sf.l2j.gameserver.ThreadPoolManager; import net.sf.l2j.gameserver.ai.CtrlIntention; import net.sf.l2j.gameserver.ai.L2AttackableAI; import net.sf.l2j.gameserver.model.L2CharPosition; import net.sf.l2j.gameserver.model.L2World; import net.sf.l2j.gameserver.model.L2WorldRegion; import net.sf.l2j.gameserver.model.actor.L2Attackable; import net.sf.l2j.gameserver.model.actor.L2Character; import net.sf.l2j.gameserver.model.actor.L2Npc; import net.sf.l2j.gameserver.model.actor.knownlist.GoodGuardKnownList; import net.sf.l2j.gameserver.network.serverpackets.ActionFailed; import net.sf.l2j.gameserver.network.serverpackets.MoveToPawn; import net.sf.l2j.gameserver.network.serverpackets.MyTargetSelected; import net.sf.l2j.gameserver.network.serverpackets.ValidateLocation; import net.sf.l2j.gameserver.templates.chars.L2NpcTemplate; import net.sf.l2j.util.Rnd; public final class L2GoodGuardInstance extends L2Attackable { private static final int RETURN_INTERVAL = 60000; public class ReturnTask implements Runnable { public void run() { if (getAI().getIntention() == CtrlIntention.AI_INTENTION_IDLE) returnHome(); } } public L2GoodGuardInstance(int objectId, L2NpcTemplate template) { super(objectId, template); ThreadPoolManager.getInstance().scheduleAiAtFixedRate(new ReturnTask(),RETURN_INTERVAL,RETURN_INTERVAL+ Rnd.nextInt(60000)); } @Override public void initKnownList() { setKnownList(new GoodGuardKnownList(this)); } @Override public final GoodGuardKnownList getKnownList() { return (GoodGuardKnownList)super.getKnownList(); } @Override public boolean isAutoAttackable(L2Character attacker) { return attacker instanceof L2MonsterInstance; } /** * Notify the L2GuardInstance to return to its home location (AI_INTENTION_MOVE_TO) and clear its _aggroList.<BR><BR> */ @Override public void returnHome() { if (!isInsideRadius(getSpawn().getLocx(), getSpawn().getLocy(), L2Npc.INTERACTION_DISTANCE, false)) { clearAggroList(); getAI().setIntention(CtrlIntention.AI_INTENTION_MOVE_TO, new L2CharPosition(getSpawn().getLocx(), getSpawn().getLocy(), getSpawn().getLocz(), 0)); } } @Override public void onSpawn() { setIsNoRndWalk(true); super.onSpawn(); // check the region where this mob is, do not activate the AI if region is inactive. L2WorldRegion region = L2World.getInstance().getRegion(getX(),getY()); if (region != null && !region.isActive()) ((L2AttackableAI) getAI()).stopAITask(); } @Override public String getHtmlPath(int npcId, int val) { String pom = ""; if (val == 0) pom = "" + npcId; else pom = npcId + "-" + val; return "data/html/guard/" + pom + ".htm"; } @Override public void onAction(L2PcInstance player) { if (!player.canTarget()) return; // Check if the L2PcInstance already target the L2GuardInstance if (getObjectId() != player.getTargetId()) { // Set the target of the L2PcInstance player player.setTarget(this); // Send a Server->Client packet MyTargetSelected to the L2PcInstance player player.sendPacket(new MyTargetSelected(getObjectId(), 0)); // Send a Server->Client packet ValidateLocation to correct the L2Npc position and heading on the client player.sendPacket(new ValidateLocation(this)); } else { // Check if the L2PcInstance is in the _aggroList of the L2GuardInstance if (containsTarget(player)) { // Set the L2PcInstance Intention to AI_INTENTION_ATTACK player.getAI().setIntention(CtrlIntention.AI_INTENTION_ATTACK, this); } else { // Calculate the distance between the L2PcInstance and the L2Npc if (!canInteract(player)) { // Set the L2PcInstance Intention to AI_INTENTION_INTERACT player.getAI().setIntention(CtrlIntention.AI_INTENTION_INTERACT, this); } else { // Some guards have no HTMs on retail. Bypass the chat window if such guard is met. switch (getNpcId()) { case 31671: case 31672: case 31673: case 31674: // Send a Server->Client ActionFailed to the L2PcInstance in order to avoid that the client wait another packet player.sendPacket(ActionFailed.STATIC_PACKET); return; } // Rotate the player to face the instance player.sendPacket(new MoveToPawn(player, this, L2Npc.INTERACTION_DISTANCE)); if (hasRandomAnimation()) onRandomAnimation(Rnd.get(); } } } } } KnownList гварда package net.sf.l2j.gameserver.model.actor.knownlist; import net.sf.l2j.gameserver.ai.CtrlIntention; import net.sf.l2j.gameserver.model.L2Object; import net.sf.l2j.gameserver.model.actor.instance.L2GoodGuardInstance; import net.sf.l2j.gameserver.model.actor.instance.L2PcInstance; public class GoodGuardKnownList extends AttackableKnownList { public GoodGuardKnownList(L2GoodGuardInstance activeChar) { super(activeChar); } @Override public boolean addKnownObject(L2Object object) { if (!super.addKnownObject(object)) return false; if (object instanceof L2PcInstance) { // Check if the object added is a L2PcInstance that owns Karma L2PcInstance player = (L2PcInstance) object; if (player.getFactionId()==2) { // Set the L2GuardInstance Intention to AI_INTENTION_ACTIVE if (getActiveChar().getAI().getIntention() == CtrlIntention.AI_INTENTION_IDLE) getActiveChar().getAI().setIntention(CtrlIntention.AI_INTENTION_ACTIVE, null); } } return true; } @Override protected boolean removeKnownObject(L2Object object, boolean forget) { if (!super.removeKnownObject(object, forget)) return false; // If the _aggroList of the L2GuardInstance is empty, set to AI_INTENTION_IDLE if (getActiveChar().noTarget()) { if (getActiveChar().hasAI()) getActiveChar().getAI().setIntention(CtrlIntention.AI_INTENTION_IDLE, null); } return true; } @Override public final L2GoodGuardInstance getActiveChar() { return (L2GoodGuardInstance)super.getActiveChar(); } } Изменено 30 апреля, 2015 пользователем P1ckw1ck Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
2terege 67 Опубликовано 30 апреля, 2015 private static final int RETURN_INTERVAL = 60000; время повтора Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
P1ckw1ck 158 Опубликовано 30 апреля, 2015 (изменено) private static final int RETURN_INTERVAL = 60000; время повтора То есть уменьшить значение 60000? Изменено 30 апреля, 2015 пользователем P1ckw1ck Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
2terege 67 Опубликовано 30 апреля, 2015 если ты понимаешь что это обозначает , а хп зачем те ихнее видеть Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
2terege 67 Опубликовано 30 апреля, 2015 60000 сначал разбери скок что отвечает Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
P1ckw1ck 158 Опубликовано 30 апреля, 2015 Что-бы можно было увидеть ихнее здоровье. Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
2terege 67 Опубликовано 30 апреля, 2015 Те придется не сюда лезть за этим в других файлах и оно не актуально Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
Мо3олЬ 68 Опубликовано 30 апреля, 2015 Что-бы можно было увидеть ихнее здоровье. ето коректируется в патче (ты про полосу ХР моба??) Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
P1ckw1ck 158 Опубликовано 30 апреля, 2015 Да только не моба а гварда. Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
2terege 67 Опубликовано 30 апреля, 2015 Так те ответили. Теперь разбирайся. Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
Silentium 592 Опубликовано 30 апреля, 2015 private static final int RETURN_INTERVAL = 60000; время повтора А теперь взгляните на код и на вопрос ТС. Думаю, поймете зачем нужна данная переменная. Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
2terege 67 Опубликовано 30 апреля, 2015 А теперь взгляните на код и на вопрос ТС. Думаю, поймете зачем нужна данная переменная. Я о том как выставлять там время если поймет Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
Silentium 592 Опубликовано 30 апреля, 2015 Я о том как выставлять там время если поймет А каким боком эта переменная относится к времени агра гварда? Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты