Перейти к содержанию
Авторизация  
P1ckw1ck

Гварды по фракции проблемка.

Рекомендуемые сообщения

Добрый вечер.

Есть гварды для гве по фракции. но они чуток не так работают.

Они не сразу агрятся на противоположного играка фракции а через 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();
    }
}

Изменено пользователем P1ckw1ck

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

private static final int RETURN_INTERVAL = 60000;  время повтора

То есть уменьшить значение 60000?

Изменено пользователем P1ckw1ck

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

если ты понимаешь  что это обозначает , а хп зачем те ихнее видеть 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Те придется не сюда лезть  за этим в других файлах и оно не актуально 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Что-бы можно было увидеть ихнее здоровье.

ето коректируется в патче (ты про полосу ХР моба??)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

private static final int RETURN_INTERVAL = 60000;  время повтора

А теперь взгляните на код и на вопрос ТС. Думаю, поймете зачем нужна данная переменная. :D

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А теперь взгляните на код и на вопрос ТС. Думаю, поймете зачем нужна данная переменная. :D

Я о том  как выставлять там время если поймет   

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Я о том  как выставлять там время если поймет   

А каким боком эта переменная относится к времени агра гварда? :)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Для публикации сообщений создайте учётную запись или авторизуйтесь

Вы должны быть пользователем, чтобы оставить комментарий

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти
Авторизация  

  • Последние посетители   0 пользователей онлайн

    Ни одного зарегистрированного пользователя не просматривает данную страницу

×
×
  • Создать...