Сообщений: 59
Тем: 15
Зарегистрирован: Jan 2013
Репутация:
-4
06-02-2014, 04:23 PM
(Сообщение последний раз редактировалось: 06-03-2014, 01:21 PM Jessy.)
High Five
first team
Подскажите пожалуйста, что дописать чтобы цикл не прекращался, чтобы Монстр бил всех монстров с данными ид вокруг, а то он одного убьёт и останавливается.
код
Код: package ai.freya;
import java.util.List;
import l2ft.gameserver.ai.CtrlEvent;
import l2ft.gameserver.ai.Fighter;
import l2ft.gameserver.model.Creature;
import l2ft.gameserver.model.instances.NpcInstance;
public class BOTS extends Fighter
{
private NpcInstance scarecrow = null;
public BOTS(NpcInstance actor)
{
super(actor);
}
@Override
public boolean isGlobalAI()
{
return true;
}
@Override
protected boolean thinkActive()
{
if(scarecrow == null)
{
List<NpcInstance> around = getActor().getAroundNpc(1000, 100);
if(around != null && !around.isEmpty())
for(NpcInstance npc : around)
if(npc != null && (npc.getNpcId() == 21350 || npc.getNpcId() == 21351 || npc.getNpcId() == 21352))
if(scarecrow == null || getActor().getDistance3D(npc) < getActor().getDistance3D(scarecrow))
scarecrow = npc;
}
if(scarecrow != null)
{
getActor().getAI().notifyEvent(CtrlEvent.EVT_AGGRESSION, scarecrow, 100);
return true;
}
return false;
}
}
Сообщений: 128
Тем: 15
Зарегистрирован: Jan 2012
Репутация:
-13
пишешь AI под фейк игроков?))
добавь Aggro в метод и будет он бить всех))
Сообщений: 59
Тем: 15
Зарегистрирован: Jan 2013
Репутация:
-4
ДА какие фейки.... мозгов не хватит... Не могу сделать даже чтобы вид у монстров был, как у игроков(( Вот пытаюсь смастерить 1-го бойца, чтобы ходил и бил мобов, так хоть интересней)
Так!???
код
Код: package ai.freya;
import java.util.List;
import l2ft.gameserver.ai.CtrlEvent;
import l2ft.gameserver.ai.Fighter;
import l2ft.gameserver.model.Creature;
import l2ft.gameserver.model.instances.NpcInstance;
public class BOTS extends Fighter
{
private NpcInstance scarecrow = null;
public BOTS(NpcInstance actor)
{
super(actor);
}
@Override
public boolean isGlobalAI()
{
return true;
}
@Override
public boolean checkAggression(Creature target)
{
return false;
}
@Override
protected boolean thinkActive()
{
if(scarecrow == null)
{
List<NpcInstance> around = getActor().getAroundNpc(1000, 100);
if(around != null && !around.isEmpty())
for(NpcInstance npc : around)
if(npc != null && (npc.getNpcId() == 21350 || npc.getNpcId() == 21351 || npc.getNpcId() == 21352))
if(scarecrow == null || getActor().getDistance3D(npc) < getActor().getDistance3D(scarecrow))
scarecrow = npc;
}
if(scarecrow != null)
{
getActor().getAI().notifyEvent(CtrlEvent.EVT_AGGRESSION, scarecrow, 100);
return true;
}
return false;
}
}
Сообщений: 128
Тем: 15
Зарегистрирован: Jan 2012
Репутация:
-13
что-то типо того:
Код: @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();
}
Сообщений: 59
Тем: 15
Зарегистрирован: Jan 2013
Репутация:
-4
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();
}
}
А вот как сделать, чтобы бил только тех кто меня бьёт не знаю, может наподобие вампирик кубика? Подскажите пожалуйста, куда копать!?
Сообщений: 100
Тем: 5
Зарегистрирован: May 2011
Репутация:
208
Собстно вопрос, на интерлюдии можно ли такое сделать?
|