дерущиеся нпц, как сделать?

agnitium

Прославленный
Проверенный
Сообщения
698
Розыгрыши
0
Репутация
720
Реакции
339
Баллы
1 473
Хочу сделать что бы 2 нпц друг с другом дрались
возможно ли такое вообще?
 

Возможно =)
 
Баталии можно устраивать=) Эпично выглядит если им еще соски с барками дать =)
 
Хочу сделать что бы 2 нпц друг с другом дрались
возможно ли такое вообще?
Код:
/*
* Copyright (C) 2004-2015 L2J DataPack
*
* This file is part of L2J DataPack.
*
* L2J DataPack 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 DataPack 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 gracia.AI.NPC.ZealotOfShilen;

import ai.npc.AbstractNpcAI;

import com.l2jserver.gameserver.ai.CtrlIntention;
import com.l2jserver.gameserver.model.actor.L2Attackable;
import com.l2jserver.gameserver.model.actor.L2Character;
import com.l2jserver.gameserver.model.actor.L2Npc;
import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;

/**
* Zealot of Shilen AI.
* @author nonom
*/
public final class ZealotOfShilen extends AbstractNpcAI
{
    // NPCs
    private static final int ZEALOT = 18782;
    private static final int[] GUARDS =
    {
        32628,
        32629
    };
   
    public ZealotOfShilen()
    {
        super(ZealotOfShilen.class.getSimpleName(), "gracia/AI/NPC");
        addSpawnId(ZEALOT);
        addSpawnId(GUARDS);
        addFirstTalkId(GUARDS);
    }
   
    @Override
    public String onAdvEvent(String event, L2Npc npc, L2PcInstance player)
    {
        if (npc == null)
        {
            return null;
        }
       
        startQuestTimer("WATCHING", 10000, npc, null, true);
        if (event.equalsIgnoreCase("WATCHING") && !npc.isAttackingNow())
        {
            for (L2Character character : npc.getKnownList().getKnownCharacters())
            {
                if (character.isMonster() && !character.isDead() && !((L2Attackable) character).isDecayed())
                {
                    npc.setRunning();
                    ((L2Attackable) npc).addDamageHate(character, 0, 999);
                    npc.getAI().setIntention(CtrlIntention.AI_INTENTION_ATTACK, character, null);
                }
            }
        }
        return null;
    }
   
    @Override
    public String onFirstTalk(L2Npc npc, L2PcInstance player)
    {
        return (npc.isAttackingNow()) ? "32628-01.html" : npc.getId() + ".html";
    }
   
    @Override
    public String onSpawn(L2Npc npc)
    {
        if (npc.getId() == ZEALOT)
        {
            npc.setIsNoRndWalk(true);
        }
        else
        {
            npc.setIsInvul(true);
            ((L2Attackable) npc).setCanReturnToSpawnPoint(false);
            startQuestTimer("WATCHING", 10000, npc, null, true);
        }
        return super.onSpawn(npc);
    }
}
 
Код:
/*
* Copyright (C) 2004-2015 L2J DataPack
*
* This file is part of L2J DataPack.
*
* L2J DataPack 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 DataPack 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 gracia.AI.NPC.ZealotOfShilen;

import ai.npc.AbstractNpcAI;

import com.l2jserver.gameserver.ai.CtrlIntention;
import com.l2jserver.gameserver.model.actor.L2Attackable;
import com.l2jserver.gameserver.model.actor.L2Character;
import com.l2jserver.gameserver.model.actor.L2Npc;
import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;

/**
* Zealot of Shilen AI.
* @author nonom
*/
public final class ZealotOfShilen extends AbstractNpcAI
{
    // NPCs
    private static final int ZEALOT = 18782;
    private static final int[] GUARDS =
    {
        32628,
        32629
    };
  
    public ZealotOfShilen()
    {
        super(ZealotOfShilen.class.getSimpleName(), "gracia/AI/NPC");
        addSpawnId(ZEALOT);
        addSpawnId(GUARDS);
        addFirstTalkId(GUARDS);
    }
  
    @Override
    public String onAdvEvent(String event, L2Npc npc, L2PcInstance player)
    {
        if (npc == null)
        {
            return null;
        }
      
        startQuestTimer("WATCHING", 10000, npc, null, true);
        if (event.equalsIgnoreCase("WATCHING") && !npc.isAttackingNow())
        {
            for (L2Character character : npc.getKnownList().getKnownCharacters())
            {
                if (character.isMonster() && !character.isDead() && !((L2Attackable) character).isDecayed())
                {
                    npc.setRunning();
                    ((L2Attackable) npc).addDamageHate(character, 0, 999);
                    npc.getAI().setIntention(CtrlIntention.AI_INTENTION_ATTACK, character, null);
                }
            }
        }
        return null;
    }
  
    @Override
    public String onFirstTalk(L2Npc npc, L2PcInstance player)
    {
        return (npc.isAttackingNow()) ? "32628-01.html" : npc.getId() + ".html";
    }
  
    @Override
    public String onSpawn(L2Npc npc)
    {
        if (npc.getId() == ZEALOT)
        {
            npc.setIsNoRndWalk(true);
        }
        else
        {
            npc.setIsInvul(true);
            ((L2Attackable) npc).setCanReturnToSpawnPoint(false);
            startQuestTimer("WATCHING", 10000, npc, null, true);
        }
        return super.onSpawn(npc);
    }
}
Все хорошо, но я для ПТС спрашивал :)
 
Для птс скорее всего аналогично - так же в аи друг на друга наагрить и все.
 
Спасибо, но как? Аль это большой секрет?)
Почему же, просто как то давно копал, но не стал углубляться, переключился на другие фишки :)
А вообще просто разбери аи Баума, ангелы которые вместе с ним появляются его же и бьют. ;)
 
Код:
/*
* Copyright (C) 2004-2015 L2J DataPack
*
* This file is part of L2J DataPack.
*
* L2J DataPack 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 DataPack 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 gracia.AI.NPC.ZealotOfShilen;

import ai.npc.AbstractNpcAI;

import com.l2jserver.gameserver.ai.CtrlIntention;
import com.l2jserver.gameserver.model.actor.L2Attackable;
import com.l2jserver.gameserver.model.actor.L2Character;
import com.l2jserver.gameserver.model.actor.L2Npc;
import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;

/**
* Zealot of Shilen AI.
* @author nonom
*/
public final class ZealotOfShilen extends AbstractNpcAI
{
    // NPCs
    private static final int ZEALOT = 18782;
    private static final int[] GUARDS =
    {
        32628,
        32629
    };
  
    public ZealotOfShilen()
    {
        super(ZealotOfShilen.class.getSimpleName(), "gracia/AI/NPC");
        addSpawnId(ZEALOT);
        addSpawnId(GUARDS);
        addFirstTalkId(GUARDS);
    }
  
    @Override
    public String onAdvEvent(String event, L2Npc npc, L2PcInstance player)
    {
        if (npc == null)
        {
            return null;
        }
      
        startQuestTimer("WATCHING", 10000, npc, null, true);
        if (event.equalsIgnoreCase("WATCHING") && !npc.isAttackingNow())
        {
            for (L2Character character : npc.getKnownList().getKnownCharacters())
            {
                if (character.isMonster() && !character.isDead() && !((L2Attackable) character).isDecayed())
                {
                    npc.setRunning();
                    ((L2Attackable) npc).addDamageHate(character, 0, 999);
                    npc.getAI().setIntention(CtrlIntention.AI_INTENTION_ATTACK, character, null);
                }
            }
        }
        return null;
    }
  
    @Override
    public String onFirstTalk(L2Npc npc, L2PcInstance player)
    {
        return (npc.isAttackingNow()) ? "32628-01.html" : npc.getId() + ".html";
    }
  
    @Override
    public String onSpawn(L2Npc npc)
    {
        if (npc.getId() == ZEALOT)
        {
            npc.setIsNoRndWalk(true);
        }
        else
        {
            npc.setIsInvul(true);
            ((L2Attackable) npc).setCanReturnToSpawnPoint(false);
            startQuestTimer("WATCHING", 10000, npc, null, true);
        }
        return super.onSpawn(npc);
    }
}
Ошибся разделом....Мог бы прочитать где тема находится ;)
 
а еще лучше, заплатить Конеру денег и он сделает)))
 
Почему же, просто как то давно копал, но не стал углубляться, переключился на другие фишки :)
А вообще просто разбери аи Баума, ангелы которые вместе с ним появляются его же и бьют. ;)
ты гений, спасибо!
 
Почему же, просто как то давно копал, но не стал углубляться, переключился на другие фишки :)
А вообще просто разбери аи Баума, ангелы которые вместе с ним появляются его же и бьют. ;)
это только на птс :D
 
Нужно смотреть хендлеры.
Точно знаю, что есть хендлер SEE_ITEM или что-то вроде того. Возможно есть хендлер который срабатывает при виде NPC
в этом хендлере добавляем желание атаковать на этого NPC
 
Есть разные пути:
1. Хендлер SEE_CREATURE. На некоторых сборках нпс имеют возможность видеть друг-друга сопровождая вызовом этого хендлера. Где можно определить, что creature.is_pc == 0 и creature.npc_class_id ) == ... ну собственно ид нпс на которого мы агримся. Но повторюсь - на некоторых. На большинстве мобы друг-друга не видят по причине "а набуя дергать хендлер и отжирать ресурсы сервера?"
2. Через BroadcastScriptEvent. Т.е. НПС одной группы рассылают вокруг себя броадкасты с одним ИД и ссылкой на себя... Что-то вроде myself.BroadcastScriptEvent(2316002, GetIndexFromCreature(myself.sm), 2000);, а нпс другой группы рассылают со своим ИД.
Ну и следовательно через хендлер ON_SCRIPT_EVENT эти данные обработать. Если перехватили евент с ИД на который надо агрится, то тут-же получили и индекс, индекс преобразовываем в CSharedCreature ( c0 = GetCreatureFromIndex( ... ) ) и можем лихо его атаковать.
3. Атака на баюма реализована через глобалмапу. Т.е. он (баюм) свой индекс прописывает в глобалмап с ид int GM_ID = 2;, архангелы читают индекс из глобалмапы, преобразовывают в CSharedCreature (как в приведенном выше примере) и атачат.
 
  • Мне нравится
Реакции: kick

    kick

    Баллов: 30
    За сообщение
Назад
Сверху Снизу