Цитата:
Сообщение от Kenrix
что-то типо того:
Код:
@Override
public boolean canAttackCharacter(Creature target)
{
NpcInstance actor = getActor();
if(getIntention() == CtrlIntention.AI_INTENTION_ATTACK)
{
AggroInfo ai = actor.getAggroList().get(target);
return ai != null && ai.hate > 0;
}
return target.isMonster() || target.isPlayable();
}
|
Добавил, но он всёравно одного убьёт и стоит, а может у меня руки кривые(что вероятнее).
Сделал по другому, взял из линдвиора аи евента Лабиринт Картии:
Свернуть ↑
Код:
package ai;
import java.util.List;
import l2ft.gameserver.utils.GArray;
import l2ft.gameserver.ai.CtrlEvent;
import l2ft.gameserver.ai.Fighter;
import l2ft.gameserver.model.Creature;
import l2ft.gameserver.model.instances.NpcInstance;
/**
* @author KilRoy
*/
public class KartiaGuard extends Fighter
{
public KartiaGuard(NpcInstance actor)
{
super(actor);
}
@Override
protected boolean thinkActive()
{
NpcInstance actor = getActor();
if(actor.isDead())
{
return false;
}
List<NpcInstance> around = getActor().getAroundNpc(1000, 100);
if(around != null && !around.isEmpty())
{
for(NpcInstance npc : around)
{
if(npc.isMonster())
{
actor.getAI().notifyEvent(CtrlEvent.EVT_AGGRESSION, npc, 300);
}
}
}
return true;
}
@Override
protected void onEvtAttacked(Creature attacker, int damage)
{
if(attacker == null || attacker.isPlayable())
{
return;
}
super.onEvtAttacked(attacker, damage);
}
@Override
public int getMaxAttackTimeout()
{
return 0;
}
@Override
protected boolean maybeMoveToHome()
{
return false;
}
@Override
protected boolean randomWalk()
{
return false;
}
}
Свернуть ↑Развернуть ↓
Поставил в Варку, теперь этот псих там месит всех вокруг)
Но я так посмотрел этот инстанс и хочу сделать, чтобы этот "Псих" бегал рядом со мной всё время и бил только тех кто меня бьёт. Порылся в Аи и нашёл вроде хождение за мной(не знаю точно то или нет):
Свернуть ↑
Код:
package ai;
import l2ft.commons.util.Rnd;
import l2ft.gameserver.Config;
import l2ft.gameserver.ai.CtrlIntention;
import l2ft.gameserver.ai.Fighter;
import l2ft.gameserver.model.Creature;
import l2ft.gameserver.model.instances.MonsterInstance;
import l2ft.gameserver.model.instances.NpcInstance;
import l2ft.gameserver.tables.SkillTable;
import l2ft.gameserver.utils.Location;
import java.util.concurrent.ScheduledFuture;
/**
* @version $Revision: 1.0 $
*/
public class KartiaGuard extends Fighter
{
private long _ReuseTimer = 0;
/**
* Field _followTask.
*/
ScheduledFuture<?> _followTask;
Creature master = null;
/**
* Constructor for FollowNpc.
* @param actor NpcInstance
*/
public KartiaGuard(NpcInstance actor)
{
super(actor);
MAX_PURSUE_RANGE = 9000;
}
/**
* Method canAttackCharacter.
* @param target Creature
* @return boolean
*/
@Override
public boolean canAttackCharacter(Creature target)
{
return target.isMonster();
}
/**
* Method onEvtThink.
*/
@Override
protected void onEvtThink()
{
final NpcInstance actor = getActor();
if(master == null)
{
master = getActor().getFollowTarget();
}
if(master == null)
{
return;
}
if(master.isDead())
{
actor.deleteMe();
}
//Check for Heal
if(actor.getNpcId() == 60029 || actor.getNpcId() == 60030 || actor.getNpcId() == 60031)
{
if(master != null && !master.isDead() && master.getCurrentHpPercents() < 80)
{
if(!actor.isCastingNow() && (_ReuseTimer < System.currentTimeMillis()))
{
actor.doCast(SkillTable.getInstance().getInfo(698, 1), master, true);
_ReuseTimer = System.currentTimeMillis() + (3 * 1000L);
}
}
}
//Check for Aggression
if(actor.getNpcId() == 60032 || actor.getNpcId() == 60033 || actor.getNpcId() == 60034)
{
if(master != null && !master.isDead() && master.getTarget() != null)
{
if(!actor.isCastingNow() && (_ReuseTimer < System.currentTimeMillis()))
{
for(NpcInstance npc : actor.getAroundNpc(600, 100))
{
if(npc instanceof MonsterInstance)
{
if(npc.getTarget().isPlayer())
{
actor.doCast(SkillTable.getInstance().getInfo(10060, 1), npc, true);
_ReuseTimer = System.currentTimeMillis() + (7 * 1000L);
}
}
}
}
}
}
if(getIntention() != CtrlIntention.AI_INTENTION_ATTACK)
{
//Check for Mobs to Attack
int mobscount = 0;
for(NpcInstance npc : actor.getAroundNpc(600, 100))
{
if(npc instanceof MonsterInstance)
{
actor.getAggroList().addDamageHate(npc, 10, 10);
mobscount++;
}
}
if(mobscount > 0 && !actor.getAggroList().isEmpty())
{
Attack(actor.getAggroList().getRandomHated(), true, false);
}
//Check for Follow
else
{
if(getIntention() == CtrlIntention.AI_INTENTION_ACTIVE)
{
setIntention(CtrlIntention.AI_INTENTION_FOLLOW);
}
if(master != null && actor.getDistance(master.getLoc()) > 300)
{
final Location loc = new Location(master.getX() + Rnd.get(-120, 120), master.getY() + Rnd.get(-120, 120), master.getZ());
actor.followToCharacter(loc, master, Config.FOLLOW_RANGE, false);
actor.setRunning();
}
}
}
super.onEvtThink();
}
}
Свернуть ↑Развернуть ↓
А вот как сделать, чтобы бил только тех кто меня бьёт не знаю, может наподобие вампирик кубика? Подскажите пожалуйста, куда копать!?