Рейтинг темы:
  • 1 Голос(ов) - 1 в среднем
  • 1
  • 2
  • 3
  • 4
  • 5
Баф, и гнев шиид
#11
немного топорно, но вполне работающе:
Код:
package ai;

import l2p.gameserver.ai.Fighter;
import l2p.gameserver.instancemanager.RaidBossSpawnManager;
import l2p.gameserver.instancemanager.RaidBossSpawnManager.Status;
import l2p.gameserver.instancemanager.ZoneManager;
import l2p.gameserver.model.L2Character;
import l2p.gameserver.model.L2Zone;
import l2p.gameserver.model.L2Zone.ZoneType;
import l2p.gameserver.model.instances.L2NpcInstance;

public class StakatoQueen extends Fighter
{
    private final static int _playerDebuffZone = 708008;
    private final static int _npcBuffZone = 708009;
    private final static int _playerBuffZone = 708010;
    private static boolean _zoneDisabled = false;

    public StakatoQueen(L2Character actor)
    {
        super(actor);
    }

    @Override
    public boolean isGlobalAI()
    {
        return true;
    }

    @Override
    protected boolean thinkActive()
    {
        L2NpcInstance actor = getActor();

        if(actor == null || actor.isDead())
            return true;

        if (!_zoneDisabled && RaidBossSpawnManager.getInstance().getRaidBossStatusId(actor.getNpcId()) == Status.ALIVE)
        {
            switchZone(false, _playerBuffZone);
            switchZone(true, _playerDebuffZone);
            switchZone(true, _npcBuffZone);
        }
        return super.thinkActive();
    }
    
    @Override
    protected void onEvtDead(L2Character killer)
    {
        switchZone(true, _playerBuffZone);
        switchZone(false, _playerDebuffZone);
        switchZone(false, _npcBuffZone);
        super.onEvtDead(killer);
    }
    
    private void switchZone(boolean zoneMode, int zoneId)
    {
        L2Zone _zone = ZoneManager.getInstance().getZoneById(ZoneType.buff_skill, zoneId, false);
        if(_zone != null && _zone.isActive() != zoneMode)
        {
            _zone.setActive(zoneMode);
            if (zoneId == _playerBuffZone)
                _zoneDisabled = !zoneMode;
        }
    }
}
З.Ы. описания зон и скиллов в них не привожу - это сделать самому раз плюнуть.
Ответ
#12
Gaikotsu Написал:немного топорно, но вполне работающе:
З.Ы. описания зон и скиллов в них не привожу - это сделать самому раз плюнуть.

Не мешало бы событие onSpawn Королевы добавить на свитч зоны Smile
А все вижу, по другому малость у вас) Но тоже вариант Big Grin
Ответ
#13
зачем плодить кучу AI? есть ведь RaidBossSpawnManager, там и переключать зоны
[Изображение: l2nextgen.gif]
Ответ
#14
я лично стараюсь больше реализовывать в датапаке, а не пихать в ядро - потом проще с редактированием и т.д. - не приходится после каждой мелкой коррекции пересобирать ядро.

а после работы с PTS сотня-другая отдельных AI меня не пугает - в PTS для каждого моба было персональное AI, не считая еще и родительских - вот там то была та еще жуть.
Ответ
#15
Вот про аи птс верно заметил) тем паче - какая разница сколько аи? главная задача не сожрать больше памяти,чем реально для реализации нужно.
Ответ
#16
Gaikotsu Написал:PTS для каждого моба было персональное AI
к этому и стремишься?)
[Изображение: l2nextgen.gif]
Ответ
#17
упаси боже

но зачем усложнять базовые классы, пихая туда частные случаи, нужные для одного моба, если проще и быстрее просто сделать отдельный маленький класс именно для этого моба.
Ответ
#18
Gaikotsu Написал:упаси боже

но зачем усложнять базовые классы, пихая туда частные случаи, нужные для одного моба, если проще и быстрее просто сделать отдельный маленький класс именно для этого моба.

всё относительно.
мне было проще написать пару строк именно там.
[Изображение: l2nextgen.gif]
Ответ
#19
а что разве нету что-то вроде
if player.inzone.zoneid == 15(допустим) в лыже?

Добавлено через 1 час 5 минут
Код:
    private static final int Center_Nest_X = 85396;
    private static final int Center_Nest_Y = -50068;
    private static final int Center_Nest_Z = -5133;
    private static final int Radius = 20000;

константы

Код:
    public String onAdvEvent(String event, L2Npc npc, L2PcInstance player)
    {
        int x = player.getX();
        int y = player.getY();
        int z = player.getZ();
        if (((x > Center_Nest_X - Radius ) && (x < Center_Nest_X + Radius ))
            && ((y > Center_Nest_Y - Radius ) && (y < Center_Nest_Y + Radius ))
            && ((z > Center_Nest_Z - Radius ) && (z < Center_Nest_Z + Radius )))
        {
            if (RaidBossSpawnManager.getInstance().getRaidBossStatusId(_stakato_mobs[25]) == StatusEnum.ALIVE)
            {
                player.getFirstEffect(6169);
            }
            else
                player.getFirstEffect(6171);
        }
        return super.onAdvEvent(event, npc, player);
    }

Собственно часть кода, пахать не пашет, может мне это вставить нада в другой класс а не в onAdvEvent() просто незнаю куда его вставить и по логике квестов решил именно сюда...)
Ответ
#20
не знаю реализуемо ли в лыже, но еще можно повесить listener'ы входа/выхода на зону stakato nest и в них обрабатывать все.

Добавлено через 2 минуты
krisadr Написал:а что разве нету что-то вроде
if player.inzone.zoneid == 15(допустим) в лыже?

Добавлено через 1 час 5 минут
Код:
    private static final int Center_Nest_X = 85396;
    private static final int Center_Nest_Y = -50068;
    private static final int Center_Nest_Z = -5133;
    private static final int Radius = 20000;

константы

Код:
    public String onAdvEvent(String event, L2Npc npc, L2PcInstance player)
    {
        int x = player.getX();
        int y = player.getY();
        int z = player.getZ();
        if (((x > Center_Nest_X - Radius ) && (x < Center_Nest_X + Radius ))
            && ((y > Center_Nest_Y - Radius ) && (y < Center_Nest_Y + Radius ))
            && ((z > Center_Nest_Z - Radius ) && (z < Center_Nest_Z + Radius )))
        {
            if (RaidBossSpawnManager.getInstance().getRaidBossStatusId(_stakato_mobs[25]) == StatusEnum.ALIVE)
            {
                player.getFirstEffect(6169);
            }
            else
                player.getFirstEffect(6171);
        }
        return super.onAdvEvent(event, npc, player);
    }

Собственно часть кода, пахать не пашет, может мне это вставить нада в другой класс а не в onAdvEvent() просто незнаю куда его вставить и по логике квестов решил именно сюда...)
один вопрос, зачем ты и 6169 и 6171 вешаешь на игроков - это одинаковые баффы вобще-то. просто 6169 вешается на мобов, когда босс жив, а на игроков в это время вешается 6170, который ничего не делает, а просто является индикатором.
Ответ


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


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