Как правильно настроить камеру в локации

  • Автор темы Автор темы Maiden7
  • Дата начала Дата начала

Maiden7

Величайший
Проверенный
Сообщения
779
Розыгрыши
0
Решения
3
Репутация
170
Реакции
621
Баллы
1 563
Хроники
  1. Chaotic Throne: High Five
Исходники
Присутствуют
Сборка
L2J Mobius
Всем добрый вчер.
Скачал Локации Фафуриона и босса вместе с ними, сделал новую локацию, скопировал скрипт AI Тараса и отредактировал.
Все отлично работает, но ролик начинается со спины босса, а надо с другой стороны.
Мне интересно, что проще переписать камеры, их положение, или повернуть босса мордой в другую сторону.
Я не знаю где взять координат, который отвечает за то, в какую сторону мордой спавнится непись/босс/моб.
Подскажите пожалуйста!!

JavaScript:
            case "SPAWN_FAFURION":
            {
                _fafurion.disableCoreAI(true);
                _fafurion.setRandomWalking(false);
                _fafurion.teleToLocation(175745, 245178, -14848, 0);
                setStatus(IN_FIGHT);
                _lastAttack = System.currentTimeMillis();
                zone.broadcastPacket(new PlaySound("BS02_A"));
                startQuestTimer("CAMERA_1", 23, _fafurion, null);
                break;
            }
            case "CAMERA_1":
            {
                zone.broadcastPacket(new SpecialCamera(npc, 700, 13, -19, 0, 10000, 20000, 0, 0, 0, 0, 0));
                startQuestTimer("CAMERA_2", 3000, npc, null);
                break;
            }
            case "CAMERA_2":
            {
                zone.broadcastPacket(new SpecialCamera(npc, 700, 13, 0, 6000, 10000, 20000, 0, 0, 0, 0, 0));
                startQuestTimer("CAMERA_3", 10000, npc, null);
                break;
            }
            case "CAMERA_3":
            {
                zone.broadcastPacket(new SpecialCamera(npc, 3700, 0, -3, 0, 10000, 10000, 0, 0, 0, 0, 0));
                zone.broadcastPacket(new SocialAction(npc.getObjectId(), 1));
                startQuestTimer("CAMERA_4", 200, npc, null);
                startQuestTimer("SOCIAL", 5200, npc, null);
                break;
            }
            case "CAMERA_4":
            {
                zone.broadcastPacket(new SpecialCamera(npc, 1100, 0, -3, 22000, 10000, 30000, 0, 0, 0, 0, 0));
                startQuestTimer("CAMERA_5", 10800, npc, null);
                break;
            }
            case "CAMERA_5":
            {
                zone.broadcastPacket(new SpecialCamera(npc, 1100, 0, -3, 300, 10000, 7000, 0, 0, 0, 0, 0));
                startQuestTimer("START_MOVE", 1900, npc, null);
                break;
            }
            case "SOCIAL":
            {
                zone.broadcastPacket(new SocialAction(npc.getObjectId(), 2));
                break;
            }
            case "START_MOVE":
            {
                _fafurion.disableCoreAI(false);
                _fafurion.setRandomWalking(true);
             
                for (Player players : World.getInstance().getVisibleObjectsInRange(npc, Player.class, 4000))
                {
                    if (players.isHero())
                    {
                        zone.broadcastPacket(new ExShowScreenMessage(NpcStringId.S1_YOU_CANNOT_HOPE_TO_DEFEAT_ME_WITH_YOUR_MEAGER_STRENGTH, 2, 4000, players.getName()));
                        break;
                    }
                }
                npc.getAI().setIntention(CtrlIntention.AI_INTENTION_MOVE_TO, new Location(175745, 245178, -14848));
                startQuestTimer("CHECK_ATTACK", 60000, npc, null);
                startQuestTimer("SPAWN_MINION", 300000, npc, null);
                break;



 
Java:
package l2p.gameserver.network.s2c.movie;

import l2p.gameserver.network.components.ServerPackets;
import l2p.gameserver.network.s2c.L2GameServerPacket;

public class SpecialCamera extends L2GameServerPacket
{
    private int _objectId, _distance, _yaw, _pitch, _speed, _duration, _relYaw, _relPitch;
    private boolean _wide, _relAngle, _skipPath;

    public SpecialCamera(int objId, int distance, int yaw, int pitch, int speed, int duration)
    {
        this(objId, distance, yaw, pitch, speed, duration, 0, 0, false, false, false);
    }

    public SpecialCamera(int objectId, int distance, int yaw, int pitch, int speed, int duration, int relYaw, int relPitch, boolean wide, boolean relAngle, boolean skipPath)
    {
        _objectId = objectId;
        _distance = distance;
        _yaw = yaw;
        _pitch = pitch;
        _speed = speed;
        _duration = duration;
        _relYaw = relYaw;
        _relPitch = relPitch;
        _wide = wide;
        _relAngle = relAngle;
        _skipPath = skipPath;
    }

    @Override
    protected final void writeImpl()
    {
        writeId(ServerPackets.SPECIAL_CAMERA);
        writeD(_objectId); // objectId объекта, на которого направлена камера
        writeD(_distance); // на какой дистанции от объекта остановится камера, возможны отрицательные значения. Если камера приблизится на столько что пройдет насквозь объект, она сделает оборот и будет показывать спину объекта
        writeD(_yaw); // с какой стороны смотреть на объект (360/0 = спереди, 180 = сзади, 90 = справа, 270 = слева)
        writeD(_pitch); // угол наклона (> 0 - смотреть сверху, < 0 - смотреть снизу)
        writeD(_speed); // скорость движения камеры [чем меньше тем быстрее] [игнорируется клиентом?]
        writeD(_duration); // сколько занимает времени режим камеры
        writeD(_relYaw); // как повернут сам обьектив по горизонтали (360/0 = прямо, 180 = назад, 90 = вправо, 270 = влево)
        writeD(_relPitch); // как повернут сам обьектив по вертикали (360/0 = прямо, 180 = верх ногами, 90 = вверх, 270 = вниз)
        writeD(_wide); //  широкоформатная камера [добавляет киношные черные полосы сверху и низу] (0 = выкл, 1 = вкл)
        writeD(_relAngle); // привязывает значения yaw/pitch к направлению взгляда объекта (0 = выкл, 1 = вкл)
        writeD(_skipPath); // пропускает кадры приближения к объекту (0 = выкл, 1 = вкл)
    }
}
 
Java:
package l2p.gameserver.network.s2c.movie;

import l2p.gameserver.network.components.ServerPackets;
import l2p.gameserver.network.s2c.L2GameServerPacket;

public class SpecialCamera extends L2GameServerPacket
{
    private int _objectId, _distance, _yaw, _pitch, _speed, _duration, _relYaw, _relPitch;
    private boolean _wide, _relAngle, _skipPath;

    public SpecialCamera(int objId, int distance, int yaw, int pitch, int speed, int duration)
    {
        this(objId, distance, yaw, pitch, speed, duration, 0, 0, false, false, false);
    }

    public SpecialCamera(int objectId, int distance, int yaw, int pitch, int speed, int duration, int relYaw, int relPitch, boolean wide, boolean relAngle, boolean skipPath)
    {
        _objectId = objectId;
        _distance = distance;
        _yaw = yaw;
        _pitch = pitch;
        _speed = speed;
        _duration = duration;
        _relYaw = relYaw;
        _relPitch = relPitch;
        _wide = wide;
        _relAngle = relAngle;
        _skipPath = skipPath;
    }

    @Override
    protected final void writeImpl()
    {
        writeId(ServerPackets.SPECIAL_CAMERA);
        writeD(_objectId); // objectId объекта, на которого направлена камера
        writeD(_distance); // на какой дистанции от объекта остановится камера, возможны отрицательные значения. Если камера приблизится на столько что пройдет насквозь объект, она сделает оборот и будет показывать спину объекта
        writeD(_yaw); // с какой стороны смотреть на объект (360/0 = спереди, 180 = сзади, 90 = справа, 270 = слева)
        writeD(_pitch); // угол наклона (> 0 - смотреть сверху, < 0 - смотреть снизу)
        writeD(_speed); // скорость движения камеры [чем меньше тем быстрее] [игнорируется клиентом?]
        writeD(_duration); // сколько занимает времени режим камеры
        writeD(_relYaw); // как повернут сам обьектив по горизонтали (360/0 = прямо, 180 = назад, 90 = вправо, 270 = влево)
        writeD(_relPitch); // как повернут сам обьектив по вертикали (360/0 = прямо, 180 = верх ногами, 90 = вверх, 270 = вниз)
        writeD(_wide); //  широкоформатная камера [добавляет киношные черные полосы сверху и низу] (0 = выкл, 1 = вкл)
        writeD(_relAngle); // привязывает значения yaw/pitch к направлению взгляда объекта (0 = выкл, 1 = вкл)
        writeD(_skipPath); // пропускает кадры приближения к объекту (0 = выкл, 1 = вкл)
    }
}
Спасибо.
И еще где получить 4й координат heading?

JavaScript:
FAFURION, loc_x, loc_y, loc_z, heading,
 
Ну так это направление куда смотрит объект, босс в данном случае
Заходишь в игру, и получаешь значение, сам посмотрев в нужном направлении и введя гм-команду для вывода heading.
Хз какая в мобиусе может быть, но в овере это //loc

З.Ы. Не помню, но вроде бы в выводе инфы по ///stat l2 это тоже есть.
 
насколько помню хеадинг 0 это на восток (вроде у корабля так, в грации сместили на -16384)
круг 32768,
по часовой в +
против -
 
насколько помню хеадинг 0 это на восток (вроде у корабля так, в грации сместили на -16384)
круг 32768,
по часовой в +
против -
Ну так это направление куда смотрит объект, босс в данном случае
Заходишь в игру, и получаешь значение, сам посмотрев в нужном направлении и введя гм-команду для вывода heading.
Хз какая в мобиусе может быть, но в овере это //loc

З.Ы. Не помню, но вроде бы в выводе инфы по ///stat l2 это тоже есть.

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

 

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

там кстати эмиттер который по центру логова надо ему поставить эвент ай ди, и включать в какой то момент наверно когда он приземляется

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

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

наверно этот эмиттер включается в финале всё таки
А как его к скрипту к AI подвязать
 
А как его к скрипту к AI подвязать
всё что могу подсказать это названия этих анимаций
enter01 - выныривает из воды и запрыгивает на своё место
Trans - стоит и рычит
death - ныряет в бетон обратно
 
всё что могу подсказать это названия этих анимаций
enter01 - выныривает из воды и запрыгивает на своё место
Trans - стоит и рычит
death - ныряет в бетон обратно
Тоже вопрос у меня такой назревал) как привязать, если смотреть скрипт Валакаса то там прописывается просто позиция камеры, не какой привязки к анимация нет.
 
Возможно привязаны к определенным социалкам, т.е. попробовать SocialAction с разными ид социалок поотсылать.
 
Возможно привязаны к определенным социалкам, т.е. попробовать SocialAction с разными ид социалок поотсылать.
Код:
    // Do spawn Valakas.
    private static class ValakasSpawn implements Runnable
    {
        private int _distance = 2550;
        private int _taskId;
        private L2BossInstance _valakas = null;
        private GArray<L2Player> _players = getPlayersInside();

        ValakasSpawn(int taskId, L2BossInstance valakas)
        {
            _taskId = taskId;
            _valakas = valakas;
        }

        @Override
        public void run()
        {
            SocialAction sa = null;

            if(_socialTask != null)
            {
                _socialTask.cancel(false);
                _socialTask = null;
            }

            switch(_taskId)
            {
                case 1:
                    Dying = false;

                    // Do spawn.
                    L2Spawn valakasSpawn = _monsterSpawn.get(Valakas);
                    _valakas = (L2BossInstance) valakasSpawn.doSpawn(true);
                    _valakas.addListener(_blistener);
                    _monsters.add(_valakas);
                    _valakas.setImmobilized(true);

                    _state.setRespawnDate(Config.FWV_FIXINTERVALOFVALAKAS, Config.FWV_RANDOMINTERVALOFVALAKAS, Config.VALAKAS_FIXRESP);
                    _state.setState(EpicBossState.State.ALIVE);
                    _state.update();

                    _socialTask = ThreadPoolManager.getInstance().schedule(new ValakasSpawn(2, _valakas), 16);
                    break;
                case 2:
                    // Do social.
                    sa = new SocialAction(_valakas.getObjectId(), 1);
                    _valakas.broadcastPacket(sa);

                    // Set camera.
                    for(L2Player pc : _players)
                        if(pc.getDistance(_valakas) <= _distance)
                        {
                            pc.enterMovieMode();
                            pc.specialCamera(_valakas, 1800, 180, -1, 1500, 15000);
                        }
                        else
                            pc.leaveMovieMode();

                    _socialTask = ThreadPoolManager.getInstance().schedule(new ValakasSpawn(3, _valakas), 1500);
                    break;
                case 3:
                    // Set camera.
                    for(L2Player pc : _players)
                        if(pc.getDistance(_valakas) <= _distance)
                        {
                            pc.enterMovieMode();
                            pc.specialCamera(_valakas, 1300, 180, -5, 3000, 15000);
                        }
                        else
                            pc.leaveMovieMode();

                    _socialTask = ThreadPoolManager.getInstance().schedule(new ValakasSpawn(4, _valakas), 3300);
                    break;
                case 4:
                    // Set camera.
                    for(L2Player pc : _players)
                        if(pc.getDistance(_valakas) <= _distance)
                        {
                            pc.enterMovieMode();
                            pc.specialCamera(_valakas, 500, 180, -8, 600, 15000);
                        }
                        else
                            pc.leaveMovieMode();

                    _socialTask = ThreadPoolManager.getInstance().schedule(new ValakasSpawn(5, _valakas), 1300);
                    break;
                case 5:
                    // Set camera.
                    for(L2Player pc : _players)
                        if(pc.getDistance(_valakas) <= _distance)
                        {
                            pc.enterMovieMode();
                            pc.specialCamera(_valakas, 1200, 180, -5, 300, 15000);
                        }
                        else
                            pc.leaveMovieMode();

                    _socialTask = ThreadPoolManager.getInstance().schedule(new ValakasSpawn(6, _valakas), 1600);
                    break;
                case 6:
                    // Set camera.
                    for(L2Player pc : _players)
                        if(pc.getDistance(_valakas) <= _distance)
                        {
                            pc.enterMovieMode();
                            pc.specialCamera(_valakas, 2800, 250, 70, 0, 15000);
                        }
                        else
                            pc.leaveMovieMode();

                    _socialTask = ThreadPoolManager.getInstance().schedule(new ValakasSpawn(7, _valakas), 200);
                    break;
                case 7:
                    // Set camera.
                    for(L2Player pc : _players)
                        if(pc.getDistance(_valakas) <= _distance)
                        {
                            pc.enterMovieMode();
                            pc.specialCamera(_valakas, 2600, 30, 60, 3400, 15000);
                        }
                        else
                            pc.leaveMovieMode();

                    _socialTask = ThreadPoolManager.getInstance().schedule(new ValakasSpawn(8, _valakas), 5700);
                    break;
                case 8:
                    // Set camera.
                    for(L2Player pc : _players)
                        if(pc.getDistance(_valakas) <= _distance)
                        {
                            pc.enterMovieMode();
                            pc.specialCamera(_valakas, 700, 150, -65, 0, 15000);
                        }
                        else
                            pc.leaveMovieMode();

                    _socialTask = ThreadPoolManager.getInstance().schedule(new ValakasSpawn(9, _valakas), 1400);
                    break;
                case 9:
                    // Set camera.
                    for(L2Player pc : _players)
                        if(pc.getDistance(_valakas) <= _distance)
                        {
                            pc.enterMovieMode();
                            pc.specialCamera(_valakas, 1200, 150, -55, 2900, 15000);
                        }
                        else
                            pc.leaveMovieMode();

                    _socialTask = ThreadPoolManager.getInstance().schedule(new ValakasSpawn(10, _valakas), 6700);
                    break;
                case 10:
                    // Set camera.
                    for(L2Player pc : _players)
                        if(pc.getDistance(_valakas) <= _distance)
                        {
                            pc.enterMovieMode();
                            pc.specialCamera(_valakas, 750, 170, -10, 1700, 5700);
                        }
                        else
                            pc.leaveMovieMode();

                    _socialTask = ThreadPoolManager.getInstance().schedule(new ValakasSpawn(11, _valakas), 3700);
                    break;
                case 11:
                    // Set camera.
                    for(L2Player pc : _players)
                        if(pc.getDistance(_valakas) <= _distance)
                        {
                            pc.enterMovieMode();
                            pc.specialCamera(_valakas, 840, 170, -5, 1200, 2000);
                        }
                        else
                            pc.leaveMovieMode();

                    _socialTask = ThreadPoolManager.getInstance().schedule(new ValakasSpawn(12, _valakas), 2000);
                    break;
                case 12:
                    // Reset camera.
                    for(L2Player pc : _players)
                        pc.leaveMovieMode();

                    _mobiliseTask = ThreadPoolManager.getInstance().schedule(new SetMobilised(_valakas), 16);

                    // Move at random.
                    if(FWV_MOVEATRANDOM)
                    {
                        Location pos = new Location(Rnd.get(211080, 214909), Rnd.get(-115841, -112822), -1662, 0);
                        _moveAtRandomTask = ThreadPoolManager.getInstance().schedule(new MoveAtRandom(_valakas, pos), 32);
                    }

                    setLastAttackTime();
                    _sleepCheckTask = ThreadPoolManager.getInstance().schedule(new CheckLastAttack(), 600000);

                    _activityTimeEndTask = ThreadPoolManager.getInstance().schedule(new ActivityTimeEnd(), (long) Config.VALAKAS_ACTIVITY_TIME);
                    break;
            }
        }
    }
Ну кстати, наверное да
 
JavaScript:
case "SPAWN_FAFURION":
            {
                _fafurion.disableCoreAI(true);
                _fafurion.setRandomWalking(false);
                _fafurion.teleToLocation(175745, 245178, -14848, 25000);
                setStatus(IN_FIGHT);
                _lastAttack = System.currentTimeMillis();
                zone.broadcastPacket(new PlaySound("BS02_A"));
                startQuestTimer("CAMERA_1", 23, _fafurion, null);
                break;
            }
            case "CAMERA_1":
            {
                zone.broadcastPacket(new SpecialCamera(npc, 700, 13, -19, 0, 10000, 20000, 0, 0, 0, 0, 0));
                startQuestTimer("CAMERA_2", 3000, npc, null);
                break;
            }
            case "CAMERA_2":
            {
                zone.broadcastPacket(new SpecialCamera(npc, 700, 13, 0, 6000, 10000, 20000, 0, 0, 0, 0, 0));
                startQuestTimer("CAMERA_3", 10000, npc, null);
                break;
            }
            case "CAMERA_3":
            {
                zone.broadcastPacket(new SpecialCamera(npc, 3700, 0, -3, 0, 10000, 10000, 0, 0, 0, 0, 0));
                zone.broadcastPacket(new SocialAction(npc.getObjectId(), 1));
                startQuestTimer("CAMERA_4", 200, npc, null);
                startQuestTimer("SOCIAL", 5200, npc, null);
                break;
            }
            case "CAMERA_4":
            {
                zone.broadcastPacket(new SpecialCamera(npc, 1100, 0, -3, 22000, 10000, 30000, 0, 0, 0, 0, 0));
                startQuestTimer("CAMERA_5", 10800, npc, null);
                break;
            }
            case "CAMERA_5":
            {
                zone.broadcastPacket(new SpecialCamera(npc, 1100, 0, -3, 300, 10000, 7000, 0, 0, 0, 0, 0));
                startQuestTimer("START_MOVE", 1900, npc, null);
                break;
            }
            case "SOCIAL":
            {
                zone.broadcastPacket(new SocialAction(npc.getObjectId(), 2));
                break;
            }
            case "START_MOVE":
            {
                _fafurion.disableCoreAI(false);
                _fafurion.setRandomWalking(true);
               
                for (Player players : World.getInstance().getVisibleObjectsInRange(npc, Player.class, 4000))
                {
                    if (players.isHero())
                    {
                        zone.broadcastPacket(new ExShowScreenMessage(NpcStringId.S1_YOU_CANNOT_HOPE_TO_DEFEAT_ME_WITH_YOUR_MEAGER_STRENGTH, 2, 4000, players.getName()));
                        break;
                    }
                }
                npc.getAI().setIntention(CtrlIntention.AI_INTENTION_MOVE_TO, new Location(175745, 245178, -14848));
                startQuestTimer("CHECK_ATTACK", 60000, npc, null);
                startQuestTimer("SPAWN_MINION", 300000, npc, null);
                break;
            }
И что с SOCIAL делать?
 
JavaScript:
case "SPAWN_FAFURION":
            {
                _fafurion.disableCoreAI(true);
                _fafurion.setRandomWalking(false);
                _fafurion.teleToLocation(175745, 245178, -14848, 25000);
                setStatus(IN_FIGHT);
                _lastAttack = System.currentTimeMillis();
                zone.broadcastPacket(new PlaySound("BS02_A"));
                startQuestTimer("CAMERA_1", 23, _fafurion, null);
                break;
            }
            case "CAMERA_1":
            {
                zone.broadcastPacket(new SpecialCamera(npc, 700, 13, -19, 0, 10000, 20000, 0, 0, 0, 0, 0));
                startQuestTimer("CAMERA_2", 3000, npc, null);
                break;
            }
            case "CAMERA_2":
            {
                zone.broadcastPacket(new SpecialCamera(npc, 700, 13, 0, 6000, 10000, 20000, 0, 0, 0, 0, 0));
                startQuestTimer("CAMERA_3", 10000, npc, null);
                break;
            }
            case "CAMERA_3":
            {
                zone.broadcastPacket(new SpecialCamera(npc, 3700, 0, -3, 0, 10000, 10000, 0, 0, 0, 0, 0));
                zone.broadcastPacket(new SocialAction(npc.getObjectId(), 1));
                startQuestTimer("CAMERA_4", 200, npc, null);
                startQuestTimer("SOCIAL", 5200, npc, null);
                break;
            }
            case "CAMERA_4":
            {
                zone.broadcastPacket(new SpecialCamera(npc, 1100, 0, -3, 22000, 10000, 30000, 0, 0, 0, 0, 0));
                startQuestTimer("CAMERA_5", 10800, npc, null);
                break;
            }
            case "CAMERA_5":
            {
                zone.broadcastPacket(new SpecialCamera(npc, 1100, 0, -3, 300, 10000, 7000, 0, 0, 0, 0, 0));
                startQuestTimer("START_MOVE", 1900, npc, null);
                break;
            }
            case "SOCIAL":
            {
                zone.broadcastPacket(new SocialAction(npc.getObjectId(), 2));
                break;
            }
            case "START_MOVE":
            {
                _fafurion.disableCoreAI(false);
                _fafurion.setRandomWalking(true);
              
                for (Player players : World.getInstance().getVisibleObjectsInRange(npc, Player.class, 4000))
                {
                    if (players.isHero())
                    {
                        zone.broadcastPacket(new ExShowScreenMessage(NpcStringId.S1_YOU_CANNOT_HOPE_TO_DEFEAT_ME_WITH_YOUR_MEAGER_STRENGTH, 2, 4000, players.getName()));
                        break;
                    }
                }
                npc.getAI().setIntention(CtrlIntention.AI_INTENTION_MOVE_TO, new Location(175745, 245178, -14848));
                startQuestTimer("CHECK_ATTACK", 60000, npc, null);
                startQuestTimer("SPAWN_MINION", 300000, npc, null);
                break;
            }
И что с SOCIAL делать?
попробовать SocialAction с разными ид социалок поотсылать
 
А у меня уже как я понимаю прописаны


JavaScript:
zone.broadcastPacket(new SocialAction(npc.getObjectId(), 1));
zone.broadcastPacket(new SocialAction(npc.getObjectId(), 2));
 
Назад
Сверху