Рейтинг темы:
  • 1 Голос(ов) - 1 в среднем
  • 1
  • 2
  • 3
  • 4
  • 5
AI Гордона
#1
имеется следующий код. это стандартный АИ Гордона, немного модифицированный под мои нужды. Хочу сделать простого НПЦ, который бегает примерно между 6 точками (без остановок) и убивает всех PC на своем пути (так же в радиусе аггро). Собственно у гордона были части кода, где он моментально телепортировался в первую (базовую точку), эти части кода были закомментированны, или же в некоторых случаях частично удалены. но осталась трабла, почему-то этот нпц добегая до 2 точки, стоит на ней очень долго (хотя таймер выставлен короткий), причем стоит на одной единственной точке (она №2 в коде), а затем бежит опять в точку №1, и так до бесконечности. т.е. остальные точки он совсем не воспринимает((, подскажите в чем ошибка?Sad

Код:
package com.l2jfrozen.gameserver.ai.special;

import java.util.Collection;

import com.l2jfrozen.gameserver.ai.CtrlIntention;
import com.l2jfrozen.gameserver.datatables.sql.SpawnTable;
import com.l2jfrozen.gameserver.model.L2Attackable;
import com.l2jfrozen.gameserver.model.actor.instance.L2NpcInstance;
import com.l2jfrozen.gameserver.model.actor.instance.L2PcInstance;
import com.l2jfrozen.gameserver.model.actor.instance.L2MonsterInstance;
import com.l2jfrozen.gameserver.model.actor.position.L2CharPosition;
import com.l2jfrozen.gameserver.model.actor.instance.L2ItemInstance;
import com.l2jfrozen.gameserver.model.quest.Quest;
import com.l2jfrozen.gameserver.model.quest.QuestState;
import com.l2jfrozen.gameserver.model.spawn.L2Spawn;
import com.l2jfrozen.util.random.Rnd;
/**
* Gordon AI
*
* @author TOFIZ
* @version $Revision: 1.1 $ $Date: 2008/08/21 $
*/
public class Gordon extends Quest implements Runnable
{
    private static final int GORDON = 70294;
    private static int _npcMoveX = 0;
    private static int _npcMoveY = 0;
    private static int _isWalkTo = 0;
    private static int _npcBlock = 0;
    private static int X = 0;
    private static int Y = 0;
    private static int Z = 0;
    private static final int[][] WALKS =
    {
            {
                    122878, 111119, -3730
            },
            {
                    120471, 112839, -3690
            },
            {
                    120380, 114327, -3662
            },
            {
                    122596, 115229, -3705
            },
            {
                    131751, 114423, -3727
            },
            {
                    122398, 114448, -3778
            }
    };

    private static boolean _isAttacked = false;
    private static boolean _isSpawned = false;

    public Gordon(int id, String name, String descr)
    {
        super(id, name, descr);

        addEventId(GORDON, Quest.QuestEventType.ON_KILL);
        addEventId(GORDON, Quest.QuestEventType.ON_ATTACK);
        addEventId(GORDON, Quest.QuestEventType.ON_SPAWN);

        // wait 2 minutes after Start AI
        startQuestTimer("check_ai", 12000, null, null,true);

        _isSpawned = false;
        _isAttacked = false;
        _isWalkTo = 1;
        _npcMoveX = 0;
        _npcMoveY = 0;
        _npcBlock = 0;
    }

    @Override
    public String onAdvEvent(String event, L2NpcInstance npc, L2PcInstance player)
    {
        X = WALKS[_isWalkTo - 1][0];
        Y = WALKS[_isWalkTo - 1][1];
        Z = WALKS[_isWalkTo - 1][2];
        if(event == "time_isAttacked")
        {
            _isAttacked = false;
            if(npc.getNpcId() == GORDON)
            {
                npc.setRunning();
                npc.getAI().setIntention(CtrlIntention.AI_INTENTION_MOVE_TO, new L2CharPosition(X, Y, Z, 0));
            }
        }
        else if(event == "check_ai")
        {
            cancelQuestTimer("check_ai", null, null);
            if(_isSpawned == false)
            {
                L2NpcInstance gordon_ai = findTemplate(GORDON);
                if(gordon_ai != null)
                {
                    _isSpawned = true;
                    startQuestTimer("Start", 12000, gordon_ai, null,true);
                    return super.onAdvEvent(event, npc, player);
                }
            }
        }
        else if(event == "Start")
        {
            //startQuestTimer("Start", 1000, npc, null);
            if(npc != null && _isSpawned == true)
            {
                // check if player in radius
                if(npc.getNpcId() == GORDON)
                {
                    Collection<L2PcInstance> chars = npc.getKnownList().getKnownPlayers().values();
                    if(chars != null && chars.size() > 0)
                    {
                        for(L2PcInstance pc : chars)
                        {
                            if(pc.isInsideRadius(npc, 5000, false, false))
                            {
                                npc.setRunning();
                                ((L2Attackable) npc).addDamageHate(pc, 0, 9999);
                                npc.getAI().setIntention(CtrlIntention.AI_INTENTION_ATTACK, pc);
                                _isAttacked = true;
                                cancelQuestTimer("time_isAttacked", null, null);
                                startQuestTimer("time_isAttacked", 12000, npc, null);
                                return super.onAdvEvent(event, npc, player);
                            }
                        }
                    }
                }
                // end check
                if(_isAttacked == true)
                    return super.onAdvEvent(event, npc, player);

                if(npc.getNpcId() == GORDON && npc.getX() - 50 <= X && npc.getX() + 50 >= X && npc.getY() - 50 <= Y && npc.getY() + 50 >= Y)
                {
                    _isWalkTo++;
                    if(_isWalkTo > 6) //change WALKS number
                    {
                        _isWalkTo = 1;
                    }
                    X = WALKS[_isWalkTo - 1][0];
                    Y = WALKS[_isWalkTo - 1][1];
                    Z = WALKS[_isWalkTo - 1][2];
                    npc.setRunning();
                    //TODO: find better way to prevent teleporting to the home location
                    /*npc.getSpawn().setLocx(X);
                    npc.getSpawn().setLocy(Y);
                    npc.getSpawn().setLocz(Z);
                    npc.getAI().setIntention(CtrlIntention.AI_INTENTION_MOVE_TO, new L2CharPosition(X, Y, Z, 0));*/
                }
                // Test for unblock Npc
                /*if(npc.getX() != _npcMoveX && npc.getY() != _npcMoveY)
                {
                    _npcMoveX = npc.getX();
                    _npcMoveY = npc.getY();
                    _npcBlock = 0;
                }
                else if(npc.getNpcId() == GORDON)
                {
                    _npcBlock++;
                    if(_npcBlock > 2)
                    {
                        npc.teleToLocation(X, Y, Z);
                        return super.onAdvEvent(event, npc, player);
                    }
                    if(_npcBlock > 0)
                    {
                        //TODO: find better way to prevent teleporting to the home location
                        npc.getSpawn().setLocx(X);
                        npc.getSpawn().setLocy(Y);
                        npc.getSpawn().setLocz(Z);
                        npc.getAI().setIntention(CtrlIntention.AI_INTENTION_MOVE_TO, new L2CharPosition(X, Y, Z, 0));
                    }
                }*/
                // End Test unblock Npc
            }
        }
        return super.onAdvEvent(event, npc, player);
    }

    @Override
    public String onSpawn(L2NpcInstance npc)
    {
        if(npc.getNpcId() == GORDON && _npcBlock == 0)
        {
            _isSpawned = true;
            _isWalkTo = 1;
            startQuestTimer("Start", 12000, npc, null);
        }
        return super.onSpawn(npc);
    }

    @Override
    public String onAttack(L2NpcInstance npc, L2PcInstance player, int damage, boolean isPet)
    {
        if(npc.getNpcId() == GORDON)
        {
            _isAttacked = true;
            cancelQuestTimer("time_isAttacked", null, null);
            startQuestTimer("time_isAttacked", 12000, npc, null);
            if(player != null)
            {
                npc.setRunning();
                ((L2Attackable) npc).addDamageHate(player, 0, 100);
                npc.getAI().setIntention(CtrlIntention.AI_INTENTION_ATTACK, player);
            }
        }
        return super.onAttack(npc, player, damage, isPet);
    }

    @Override
    public String onKill(L2NpcInstance npc, L2PcInstance killer, boolean isPet)
    {
        if(npc.getNpcId() == GORDON)
        {
            cancelQuestTimer("Start", null, null);
            cancelQuestTimer("time_isAttacked", null, null);
            _isSpawned = false;
        }
        return super.onKill(npc, killer, isPet);
    }
    
    /**private static void dropItem(L2NpcInstance npc, L2PcInstance player)
    {
        npc.DropItem(killer, 1665, Rnd.get(5, 12));
        npc.DropItem(killer, 9999, Rnd.get(13, 38));
    }**/

    public L2NpcInstance findTemplate(int npcId)
    {
        L2NpcInstance npc = null;
        for(L2Spawn spawn : SpawnTable.getInstance().getSpawnTable().values())
        {
            if(spawn != null && spawn.getNpcid() == npcId)
            {
                npc = spawn.getLastSpawn();
                break;
            }
        }
        return npc;
    }

    @Override
    public void run()
    {}
}
[Изображение: ck.gif]
Ответ
#2
Самый ИДИОТСКИЙ вариант.
Ога, засекаем время, и вызываем таймеры. Бред.
Проще для события AI EVT_ARRIVED сделать вызов метода квеста.
Будет и удобнее, и красивее и кошернее
Ответ


Возможно похожие темы ...
Тема Автор Ответы Просмотры Последний пост
  переделанный AI гордона, ошибка(( mego4el 1 1,312 02-05-2012, 08:40 PM
Последний пост: mego4el

Перейти к форуму:


Пользователи, просматривающие эту тему: 1 Гость(ей)