11-24-2011, 03:28 PM
имеется следующий код. это стандартный АИ Гордона, немного модифицированный под мои нужды. Хочу сделать простого НПЦ, который бегает примерно между 6 точками (без остановок) и убивает всех PC на своем пути (так же в радиусе аггро). Собственно у гордона были части кода, где он моментально телепортировался в первую (базовую точку), эти части кода были закомментированны, или же в некоторых случаях частично удалены. но осталась трабла, почему-то этот нпц добегая до 2 точки, стоит на ней очень долго (хотя таймер выставлен короткий), причем стоит на одной единственной точке (она №2 в коде), а затем бежит опять в точку №1, и так до бесконечности. т.е. остальные точки он совсем не воспринимает((, подскажите в чем ошибка?

Код:
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]](http://forum.zone-game.info/images/smilies/ozzy/ck.gif)