YTDB

YTDB (http://ytdb.ru/index.php)
-   Необходима поддержка скриптов / Needs script support (http://ytdb.ru/forumdisplay.php?f=48)
-   -   Crimson Hall. (http://ytdb.ru/showthread.php?t=14345)

Ulduar 04.03.2014 00:28

Нужно что-то ещё.
 
Вложений: 1
Добрый вечер. Имеется вот такая дверь(то что она закрыта по дефолту - это правильно), также есть и нпц перед ней. Скриншот:
http://ytdb.ru/attachment.php?attach...1&d=1393878412
На оффе после убийства мобов должна открываться эта самая дверь.

Код:

DATA_CRIMSONHALL_EVENT          = 1,                  Pre Blood Prince mini event.
NPC_DARKFALLEN_NOBLE            = 37663,        Pre Blood Prince Door mini event.
        NPC_DARKFALLEN_BLOOD_KNIGHT    = 37595,
        NPC_DARKFALLEN_ADVISOR          = 37571,
        NPC_DARKFALLEN_ARCMAGE          = 37664,

void SetData64(uint32 uiType, uint64 uiGuid) override;
GuidSet m_sPreCrimsonHallMobsAliveGUIDSet;
это для файла icecrown_citadel.h если что-то забыл добавить, пишите.

Для файла instance_icecrown_citadel.cpp
Код:

void instance_icecrown_citadel::OnCreatureCreate(Creature* pCreature)
            case NPC_DARKFALLEN_NOBLE         
            case NPC_DARKFALLEN_BLOOD_KNIGHT   
            case NPC_DARKFALLEN_ARCMAGE
            case NPC_DARKFALLEN_ARCMAGE
                // Filter only the mobs spawned on Pre Crimson Hall Door.
            if (pCreature->GetPositionZ() < 361.0f)
                m_sPreCrimsonHallMobsGUIDSet.insert(pCreature->GetObjectGuid());
                    break;
    }
}

void instance_icecrown_citadel:SetData64(uint32 uiData, uint64 uiGuid)
{
    // If Blood Prince Council already completed, just ignore
    if (GetData(TYPE_BLOOD_PRINCE_COUNCIL) == DONE)
        return;

    // Note: this is handled in Acid. The purpose is check which Pre Crimson Hall mobs is alive, in case of server reset
    // The function is triggered by eventAI on generic timer
    if (uiData == DATA_CRIMSONHALL_EVENT)
        m_sPreCrimsonHallMobsGUIDSet.insert(pCreature->GetObjectGuid());
}

Код:

void instance_icecrown_citadel::OnCreatureDeath(Creature* pCreature)
            case NPC_DARKFALLEN_NOBLE         
            case NPC_DARKFALLEN_BLOOD_KNIGHT   
            case NPC_DARKFALLEN_ARCMAGE
            case NPC_DARKFALLEN_ARCMAGE
                break;

Постараюсь потом добавить ещё что-нибудь. Одно знаю точно - эти мобы не уникальны, поэтому нужен check Guid.
Вообщем от скрипта требуется одно - сделать проверку на этих нпц и если они убиты(те что перед дверью, а не за ней и перед Ланателью) то открывать дверь.

Ulduar 06.03.2014 02:24

Тут нужно ещё дополнять, но я запутался. Смотрел вон в Тёмном Лабиринте реализацию(убиваешь всех мобов и Посол Гиблочрев снимает с себя баниш и стартует хождение по точкам), а тут надо с GO работать. Составить бы скрипт и разрабам отправить. На форум СД2 писать не стоит, там затишье.

Ulduar 07.04.2014 03:36

Нет необходимости в SD2 скрипте. SCRIPT_COMMAND_TERMINATE_SCRIPT нам поможет!

Код:

-- Script id: 37664
DELETE FROM dbscripts_on_creature_death WHERE id=37664;
INSERT INTO dbscripts_on_creature_death VALUES
(37664,0,31,37595,30,0,0,8,0,0,0,0,0,0,0,0,'Terminate script Open Crimson Hall Door'),
(37664,0,31,37663,30,0,0,8,0,0,0,0,0,0,0,0,'Terminate script Open Crimson Hall Door'),
(37664,0,31,37571,30,0,0,8,0,0,0,0,0,0,0,0,'Terminate script Open Crimson Hall Door'),
(37664,1,11,0,0,201376,100,0,0,0,0,0,0,0,0,0,'Open Door Crimson Hall at condition what all friendly radius dead.');

-- Script id: 37595
DELETE FROM dbscripts_on_creature_death WHERE id=37595;
INSERT INTO dbscripts_on_creature_death VALUES
(37595,0,31,37664,30,0,0,8,0,0,0,0,0,0,0,0,'Terminate script Open Crimson Hall Door'),
(37595,0,31,37663,30,0,0,8,0,0,0,0,0,0,0,0,'Terminate script Open Crimson Hall Door'),
(37595,0,31,37571,30,0,0,8,0,0,0,0,0,0,0,0,'Terminate script Open Crimson Hall Door'),
(37595,1,11,0,0,201376,100,0,0,0,0,0,0,0,0,0,'Open Door Crimson Hall at condition what all friendly radius dead.');

-- Script id: 37663
DELETE FROM dbscripts_on_creature_death WHERE id=37663;
INSERT INTO dbscripts_on_creature_death VALUES
(37663,0,31,37664,30,0,0,8,0,0,0,0,0,0,0,0,'Terminate script Open Crimson Hall Door'),
(37663,0,31,37595,30,0,0,8,0,0,0,0,0,0,0,0,'Terminate script Open Crimson Hall Door'),
(37663,0,31,37571,30,0,0,8,0,0,0,0,0,0,0,0,'Terminate script Open Crimson Hall Door'),
(37663,1,11,0,0,201376,100,0,0,0,0,0,0,0,0,0,'Open Door Crimson Hall at condition what all friendly radius dead.');

-- Script id: 37571
DELETE FROM dbscripts_on_creature_death WHERE id=37571;
INSERT INTO dbscripts_on_creature_death VALUES
(37571,0,31,37664,30,0,0,8,0,0,0,0,0,0,0,0,'Terminate script Open Crimson Hall Door'),
(37571,0,31,37663,30,0,0,8,0,0,0,0,0,0,0,0,'Terminate script Open Crimson Hall Door'),
(37571,0,31,37595,30,0,0,8,0,0,0,0,0,0,0,0,'Terminate script Open Crimson Hall Door'),
(37571,1,11,0,0,201376,100,0,0,0,0,0,0,0,0,0,'Open Door Crimson Hall at condition what all friendly radius dead.');

Каждому мобу создал. Будет прерывать скрипт открывания двери, если 3 ближних существа(id указаны) живы.
Мне вот интересно SCRIPT_COMMAND_TERMINATE_CONDITION работает только для квестов? Было бы неплохо иметь возможность работать с кондициями.

Ulduar 07.04.2014 12:49

Только мобов друг от друга не отводите далеко.

Что скажете по поводу скрипта? Не хак? :)

Ulduar 10.04.2014 22:37

SCRIPT_COMMAND_TERMINATE_CONDITION:
Код:

case SCRIPT_COMMAND_TERMINATE_COND:            // 34
            {
                if (!sConditionStorage.LookupEntry<PlayerCondition>(tmp.terminateCond.conditionId))
                {
                    sLog.outErrorDb("Table `%s` has datalong = %u in SCRIPT_COMMAND_TERMINATE_COND for script id %u, but this condition_id does not exist.", tablename, tmp.terminateCond.conditionId, tmp.id);
                    continue;
                }
                if (tmp.terminateCond.failQuest && !sObjectMgr.GetQuestTemplate(tmp.terminateCond.failQuest))
                {
                    sLog.outErrorDb("Table `%s` has datalong2 = %u in SCRIPT_COMMAND_TERMINATE_COND for script id %u, but this questId does not exist.", tablename, tmp.terminateCond.failQuest, tmp.id);
                    continue;
                }
                break;
            }

Раз имеют continue(переводя по простому значит продолжать)
То я думаю, что может работать не только для квестов.
Что самое интересное, TERMINATE_SCRIPT и TERMINATE_CONDITION могут работать вместе(хотя Xfurry собирает добавить новую кондицию)
http://ytdb.ru/showthread.php?t=14148
Я внимательно просмотрел работу NeatElves и могу смело утверждать, что квест необязателен для использования этой команды.
Можно добавить несколько кондиций сразу для прерывания скрипта и если хотя бы одно из них(условий) не выполняется, то будет прерывать скрипт.

Осталось только добавить возможность для свободного взаимодействия EAI и db_script и дело в шляпе!

YuruY 11.04.2014 09:14

Цитата:

(хотя Xfurry собирает добавить новую кондицию
Когда это будет? Вет ка 434 мертвая.

Ulduar 11.04.2014 11:37

Не будем торопить события раньше времени. Я например благодаря Мангосу понял разницу между return true(возврат, если условие выполняется) и return false(возврат, если условие не выполняется). Раньше и в этом путался. Это лучше учебника по С++.
Вы пожалуйста лучше скажите, всё ли правильно по поводу TERMINATE_CONDITION сказал?

Ulduar 26.04.2014 22:38

А вот и кондиция собственно плюс новая команда плюс улучшение для AI Event.
https://github.com/cmangos/issues/is...issue-32130701

Ulduar 04.05.2014 20:31

Заимплементили и AI Event и кондицию, и power type. Осталось дождаться пуша в Катаклизм ветку.
Также Radu хочет заимплементить db_script_on_areatrigger. Источником и таргетом будет игрок. Суммон Рагны можно реализовать будет в ОП! Не хакая и оффлайк!
Скриптуй не хочу как говориться! Вроде ещё собирался добавить SCRIPT_COMMAND_SEND_AIEVENT. Для взаимодействия EAI, SD2 и db_script. Но к сожалению не добавлял.


Текущее время: 03:38. Часовой пояс GMT +4.

YTDB - MaNGOS DataBase