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

Возврат гвардов на место, при убийстве персонажа.

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

Добрый день, есть 2 проблемки прощу помощи.

 

1. когда гварды убивают персонажа из другой фракции они не возвращаются на место.

2. гвардов нельзя бить маг скилами.

 

Сам код гварда 1 из фракции.    L2GoodGuardInstance.

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.L2Skill;
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.StatusUpdate;
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));
        }
        
        if (this != player.getTarget())
        {
            // Set the target of the L2PcInstance player
            player.setTarget(this);

            MyTargetSelected my = new MyTargetSelected(getObjectId(), player.getLevel() - getLevel());
            player.sendPacket(my);

            // Send a Server->Client packet StatusUpdate of the L2PetInstance to the L2PcInstance to update its HP bar
            StatusUpdate su = new StatusUpdate(this);
            su.addAttribute(StatusUpdate.CUR_HP, (int) getStatus().getCurrentHp());
            su.addAttribute(StatusUpdate.MAX_HP, getMaxHp());
            player.sendPacket(su);

        }
        
        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'a нужно вносить изменения еще в L2AttackableAI, т.к. у обычных гвардов, которые агрятся на мобов и пк по стандарту идет этот АИ. Также можно сделать этих гвардов на основе осадных (L2SiegeGuard), т.к. они используют свой АИ (L2SiegeGuardAI) который можно легко изменить под себя как угодно, не придется копаться в большом классе L2AttackableAI. Когда я занимался ГвЕ, выбирал 2ой вариант

  • Upvote 1

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


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

Я так понимаю, за основу брался пример обычных гвардов? По мимо создания knownList'a нужно вносить изменения еще в L2AttackableAI, т.к. у обычных гвардов, которые агрятся на мобов и пк по стандарту идет этот АИ. Также можно сделать этих гвардов на основе осадных (L2SiegeGuard), т.к. они используют свой АИ (L2SiegeGuardAI) который можно легко изменить под себя как угодно, не придется копаться в большом классе L2AttackableAI. Когда я занимался ГвЕ, выбирал 2ой вариант

Да брал их.

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


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

По поводу 1 пункта не знаю т.к. структуры вашего l2j не имею понятия.

У вас наследник L2Attackable, возможно по 2 пункту там костыль. 

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

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


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

По 2 пункту смотрите метод DoCast() в классе L2Charcter и ищите там проверку на запрет атаки гвардов скиллами.

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


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

По 2 пункту смотрите метод DoCast() в классе L2Charcter и ищите там проверку на запрет атаки гвардов скиллами.

        public void doCast(L2Skill skill)

        {

            L2Character.this.doCast(skill);

        }

 

Тут разве есть запрет?

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


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

Пролверьте метод DoAtack и BeginCast может там есть проверка.

Ищите что то типа 

 

if (this instanceof L2pcInstance && this.getTarget instanceof L2GoodGuard)

{

if (skill.isMagic)

 {

return false

}

}

Точно хз как у вас.

 

 

 

Щас проверил, проверка в BeginCast должна быть.

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

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


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

Пролверьте метод DoAtack и BeginCast может там есть проверка.

Ищите что то типа 

 

if (this instanceof L2pcInstance && this.getTarget instanceof L2GoodGuard)

{

if (skill.isMagic)

 {

return false

}

}

Точно хз как у вас.

 

 

 

Щас проверил, проверка в BeginCast должна быть.

Такого тоже нету в L2Character.java

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


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

Залей этот класс на файлообменник я гляну, может найду.

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


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

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

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

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

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

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

Войти

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

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

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

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

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