PDA

Просмотр полной версии : Crimson Hall.


Ulduar
04.03.2014, 00:28
Добрый вечер. Имеется вот такая дверь(то что она закрыта по дефолту - это правильно), также есть и нпц перед ней. Скриншот:
http://ytdb.ru/attachment.php?attachmentid=2722&stc=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(Creatu re* 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(Creatur e* 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,'Termin ate script Open Crimson Hall Door'),
(37664,0,31,37663,30,0,0,8,0,0,0,0,0,0,0,0,'Termin ate script Open Crimson Hall Door'),
(37664,0,31,37571,30,0,0,8,0,0,0,0,0,0,0,0,'Termin ate 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,'Termin ate script Open Crimson Hall Door'),
(37595,0,31,37663,30,0,0,8,0,0,0,0,0,0,0,0,'Termin ate script Open Crimson Hall Door'),
(37595,0,31,37571,30,0,0,8,0,0,0,0,0,0,0,0,'Termin ate 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,'Termin ate script Open Crimson Hall Door'),
(37663,0,31,37595,30,0,0,8,0,0,0,0,0,0,0,0,'Termin ate script Open Crimson Hall Door'),
(37663,0,31,37571,30,0,0,8,0,0,0,0,0,0,0,0,'Termin ate 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,'Termin ate script Open Crimson Hall Door'),
(37571,0,31,37663,30,0,0,8,0,0,0,0,0,0,0,0,'Termin ate script Open Crimson Hall Door'),
(37571,0,31,37595,30,0,0,8,0,0,0,0,0,0,0,0,'Termin ate 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.fai lQuest))
{
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/issues/409#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. Но к сожалению не добавлял.