PDA

Просмотр полной версии : Trinity Заселение ЦЛК (чиcтка 335+434)


Chaosua
20.05.2014, 23:45
Уже давно хотел про это написать, да все забывал, пока игроки опять не затянули в цлк

в коде тринити есть такая штука в instance_icecrown_citadel.cpp
case NPC_KOR_KRON_GENERAL:
if (TeamInInstance == ALLIANCE)
creature->UpdateEntry(NPC_ALLIANCE_COMMANDER);
break;
case NPC_KOR_KRON_LIEUTENANT:
if (TeamInInstance == ALLIANCE)
creature->UpdateEntry(NPC_SKYBREAKER_LIEUTENANT);
break;
case NPC_TORTUNOK:
if (TeamInInstance == ALLIANCE)
creature->UpdateEntry(NPC_ALANA_MOONSTRIKE);
break;
case NPC_GERARDO_THE_SUAVE:
if (TeamInInstance == ALLIANCE)
creature->UpdateEntry(NPC_TALAN_MOONSTRIKE);
break;
case NPC_UVLUS_BANEFIRE:
if (TeamInInstance == ALLIANCE)
creature->UpdateEntry(NPC_MALFUS_GRIMFROST);
break;
case NPC_IKFIRUS_THE_VILE:
if (TeamInInstance == ALLIANCE)
creature->UpdateEntry(NPC_YILI);
break;
case NPC_VOL_GUK:
if (TeamInInstance == ALLIANCE)
creature->UpdateEntry(NPC_JEDEBIA);
break;
case NPC_HARAGG_THE_UNSEEN:
if (TeamInInstance == ALLIANCE)
creature->UpdateEntry(NPC_NIBY_THE_ALMIGHTY);
break;
case NPC_GARROSH_HELLSCREAM:
if (TeamInInstance == ALLIANCE)
creature->UpdateEntry(NPC_KING_VARIAN_WRYNN);
break;
case NPC_DEATHBRINGER_SAURFANG:
DeathbringerSaurfangGUID = creature->GetGUID();
break;
case NPC_ALLIANCE_GUNSHIP_CANNON:
case NPC_HORDE_GUNSHIP_CANNON:
creature->SetControlled(true, UNIT_STATE_ROOT);
break;
case NPC_SE_HIGH_OVERLORD_SAURFANG:
if (TeamInInstance == ALLIANCE)
creature->UpdateEntry(NPC_SE_MURADIN_BRONZEBEARD, creature->GetCreatureData());
// no break;
case NPC_SE_MURADIN_BRONZEBEARD:
DeathbringerSaurfangEventGUID = creature->GetGUID();
creature->LastUsedScriptID = creature->GetScriptId();
break;
case NPC_SE_KOR_KRON_REAVER:
if (TeamInInstance == ALLIANCE)
creature->UpdateEntry(NPC_SE_SKYBREAKER_MARINE);
break;
все эти апдейты темплейта рабтают на ТДБ на ура.
Весь принцип в следующем:
1. В цлк есть мобы которые видны лиш одной фракции. В результате образовались пары мобов которые не пересекаются.
2. Скрипт проверяет фракцию и на соответствующем условии меняет темплейт моба на противоположный в паре
Скрипт сделан так что нужно заселение "пары" только для одной стороны (в нашем случае - орда), противоположная сторона получит противоположного моба из пары автоматически. (прямо как на оло)
Следовательно уменьшается количество записей в базе, меньше нагрузка на память ну и все вытекающие.
К чему я все это пишу? на YTDB заспавнены эти "парные мобы" для обеих сторон в фазах 64 и 128 изза чего скрипт работает очень странно иногда, то ивент не активируется то мобов слишком много.
Что надо сделать чтобы этого не было. - удалить все заселение парных комплектов для альянса, а ордынской половине прописать первую фазу, чтобы скрипт мог адекватно работать по инструкции. В том куске кода наглядно видно какие мобы образуют парность.

DELETE FROM `creature` WHERE `map`=631 AND `id` IN (37190, 38492, 37999, 37998, 38283, 37997, 38840, 38182, 39371);
UPDATE `creature` SET `phaseMask`=1 WHERE `map`=631 AND `id` IN (37189, 38491, 37992, 37993, 38284, 37991, 38841, 38181, 39372);

PS: эти черти склетоны http://ru.wowhead.com/npc=37007 должны стоять пока ловушку не активируют, на 4,3,4 они бродят
http://www.ytdb.ru/showthread.php?t=14529&highlight=37007 тут уже писали
Плюс надо поправить координаты спавна под стойки для них, так как они все почти по центру коридора фактически заспавнены, если мне не изменяет память на 335 они правильно стояли.
UPDATE `creature` SET `MovementType` = 0 WHERE `id` = 37007;
#колонка emote=417 отменяет ауру - зануляем
DELETE FROM `creature_template_addon` WHERE (`entry`=37007);
INSERT INTO `creature_template_addon` (`entry`, `path_id`, `mount`, `bytes1`, `bytes2`, `emote`, `auras`) VALUES
(37007, 0, 0, 0, 0, 0, 70733);
DELETE FROM `creature_template_addon` WHERE (`entry`=38031);
INSERT INTO `creature_template_addon` (`entry`, `path_id`, `mount`, `bytes1`, `bytes2`, `emote`, `auras`) VALUES
(38031, 0, 0, 0, 0, 0, 70733);

YuruY
21.05.2014, 05:47
эти черти склетоны http://ru.wowhead.com/npc=37007 должны стоять пока ловушку не активируют, на 4,3,4 они бродят
Поинты до кучи надо удалять у них тогда, ато смысла от твоей правки нет, финал_ап вернет на место двойку при наличии поинтов у моба.

Ulduar
21.05.2014, 14:39
Поинты до кучи надо удалять у них тогда, а то смысла от твоей правки нет, финал_ап вернет на место двойку при наличии поинтов у моба.

Поинты у них должны быть, просто они должны активироваться ловушкой, а иначе должны стоять на месте. На Мангосе я делал обработку через db_script_on_event, правда по гуидам стражей, по другому никак.
Chaosua скажите разрабам, чтобы поправили скрипт, а то у вас на Трине после активации ловушки Стражи не то что по вайпоинтам не ходят, а тупо вступают в бой, что является ошибкой.

class spell_icc_sprit_alarm : public SpellScriptLoader
{
public:
spell_icc_sprit_alarm() : SpellScriptLoader("spell_icc_sprit_alarm") { }

class spell_icc_sprit_alarm_SpellScript : public SpellScript
{
PrepareSpellScript(spell_icc_sprit_alarm_SpellScri pt);

void HandleEvent(SpellEffIndex effIndex)
{
PreventHitDefaultEffect(effIndex);
uint32 trapId = 0;
switch (GetSpellInfo()->Effects[effIndex].MiscValue)
{
case EVENT_AWAKEN_WARD_1:
trapId = GO_SPIRIT_ALARM_1;
break;
case EVENT_AWAKEN_WARD_2:
trapId = GO_SPIRIT_ALARM_2;
break;
case EVENT_AWAKEN_WARD_3:
trapId = GO_SPIRIT_ALARM_3;
break;
case EVENT_AWAKEN_WARD_4:
trapId = GO_SPIRIT_ALARM_4;
break;
default:
return;
}

if (GameObject* trap = GetCaster()->FindNearestGameObject(trapId, 5.0f))
trap->SetRespawnTime(trap->GetGOInfo()->GetAutoCloseTime());

std::list<Creature*> wards;
GetCaster()->GetCreatureListWithEntryInGrid(wards, NPC_DEATHBOUND_WARD, 150.0f);
wards.sort(Trinity::ObjectDistanceOrderPred(GetCas ter()));
for (std::list<Creature*>::iterator itr = wards.begin(); itr != wards.end(); ++itr)
{
if ((*itr)->IsAlive() && (*itr)->HasAura(SPELL_STONEFORM))
{
(*itr)->AI()->Talk(SAY_TRAP_ACTIVATE);
(*itr)->RemoveAurasDueToSpell(SPELL_STONEFORM);
if (Unit* target = (*itr)->SelectNearestTarget(150.0f))
(*itr)->AI()->AttackStart(target);
break;
}
}
}

Emote вы правильно занулили, в spell_script есть обработка.
void OnApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
{
if (Creature* target = GetTarget()->ToCreature())
{
target->SetReactState(REACT_PASSIVE);
target->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE | UNIT_FLAG_IMMUNE_TO_PC);
target->SetUInt32Value(UNIT_NPC_EMOTESTATE, EMOTE_STATE_CUSTOM_SPELL_02);
}
}

void OnRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
{
if (Creature* target = GetTarget()->ToCreature())
{
target->SetReactState(REACT_AGGRESSIVE);
target->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE | UNIT_FLAG_IMMUNE_TO_PC);
target->SetUInt32Value(UNIT_NPC_EMOTESTATE, 0);
}
}