|
Новичкам Информация для всех новичков, новичкам рекомендуется задавать свои вопросы здесь |
|
Опции темы | Поиск в этой теме | Опции просмотра |
01.03.2011, 19:45 | #1 |
Администратор
|
Остановка боя и действия при спадании ауры
Есть нпц, на которого накладывается аура на 10 секунд.
НПЦ при этом вводится в бой: Код:
((Creature*)m_target)->AI()->AttackStart(caster); Не получается вывести нпц из боя и сменить ему фракцию: Код:
target->AttackStop(); target->CombatStop(true); target->setFaction(35); 2. Каким образом вывести нпц из боя и сменить ему фракцию? 3. Есть ли в ядре способ заставить нпц следовать за игроком, или нужен скрипт СД2? |
01.03.2011, 20:18 | #2 |
Почетный флудер
Старожил
Регистрация: 08.03.2010
Адрес: Мурманск, Россия
Сообщений: 788
Сказал(а) спасибо: 55
Поблагодарили 333 раз(а) в 151 сообщениях
Записей в дневнике: 1
|
там же и в бою отрабатывается, и скорее всего отрабатывает нормально. но attackstop/combatstop оттуда не сделать (точнее сделать можно но тут же перебьется), надо кидать эвент и по нему выводить.
|
01.03.2011, 20:23 | #3 |
Администратор
|
В void SpellAuraHolder::HandleSpellSpecificBoosts(bool apply):
Код:
case 46620: // Red Dragonblood { if (apply) if(Unit* caster = GetCaster()) if (caster->GetTypeId() == TYPEID_PLAYER && caster->isAlive() && m_target->GetTypeId() == TYPEID_UNIT && m_target->isAlive()) ((Creature*)m_target)->AI()->AttackStart(caster); else { cast_at_remove = true; spellId1 = 46673; // Capture Trigger } break; } В обработке думми-аур: Код:
case 46675: if (target->GetTypeId() != TYPEID_UNIT) return; if (Unit* caster = GetCaster()) if (caster->GetTypeId() == TYPEID_PLAYER) { target->AttackStop(); target->CombatStop(true); target->setFaction(35); // Drake Hatchling Subdued target->CastSpell(caster, 46691, true, NULL, this); // Rope Beam target->CastSpell(caster, 46674, true, NULL, this); //target->GetMotionMaster()->MoveFollow(caster, PET_FOLLOW_DIST, PET_FOLLOW_ANGLE); } // allow script for the process of returning the NPC return; |
01.03.2011, 21:06 | #4 |
Почетный флудер
Старожил
Регистрация: 08.03.2010
Адрес: Мурманск, Россия
Сообщений: 788
Сказал(а) спасибо: 55
Поблагодарили 333 раз(а) в 151 сообщениях
Записей в дневнике: 1
|
и не отработает. надо
Код:
case 46620: // Red Dragonblood { if (apply) { if(Unit* caster = GetCaster()) if (caster->GetTypeId() == TYPEID_PLAYER && caster->isAlive() && m_target->GetTypeId() == TYPEID_UNIT && m_target->isAlive()) ((Creature*)m_target)->AI()->AttackStart(caster); } else { cast_at_remove = true; spellId1 = 46673; // Capture Trigger } break; } |
01.03.2011, 21:49 | #5 |
Администратор
|
Была мысль, но не успел проверить.
Я думал, что ифы ступенчатые, а else уйдет к верхнему. |
01.03.2011, 22:59 | #6 |
Администратор
|
Код:
target->AttackStop(); target->CombatStop(true); target->getHostileRefManager().deleteReferences(); target->setFaction(35); Фракция меняется, но нпц продолжает атаковать игрока. Как вывести нпц из боя? |
02.03.2011, 07:15 | #7 |
Почетный флудер
Старожил
Регистрация: 08.03.2010
Адрес: Мурманск, Россия
Сообщений: 788
Сказал(а) спасибо: 55
Поблагодарили 333 раз(а) в 151 сообщениях
Записей в дневнике: 1
|
см. пост 2. 1) регистрируем эвент (пофиг какой и как, лучше взять безобидный думми-спелл и обработать его в SD2) 2) по эвенту снимаем враждебные спеллы, чистим третлист и после этого выводим из боя.
|
02.03.2011, 08:05 | #8 |
Пользователь
Регистрация: 23.03.2010
Сообщений: 51
Сказал(а) спасибо: 14
Поблагодарили 32 раз(а) в 15 сообщениях
|
AttackStop() лишний, и так будет в CombatStop().
Возвращается в бой нпц потому, что ты не почистил _его_ список аггро Код:
target->DeleteThreatList() Последний раз редактировалось Vinolentus; 02.03.2011 в 08:19. |
02.03.2011, 08:34 | #9 |
Администратор
|
Примеры брал из ядра и СД2, но они не отработали.
Т.е. в конечном итоге будет: Код:
target->CombatStop(true); target->DeleteThreatList() target->setFaction(35); |
02.03.2011, 11:17 | #10 | ||
Пользователь
Регистрация: 23.03.2010
Сообщений: 51
Сказал(а) спасибо: 14
Поблагодарили 32 раз(а) в 15 сообщениях
|
Цитата:
Цитата:
Код:
target->CombatStop(true); target->DeleteThreatList(); target->getHostileRefManager().deleteReferences(); target->setFaction(35); Последний раз редактировалось Vinolentus; 02.03.2011 в 11:27. |
||
02.03.2011, 11:51 | #11 |
Администратор
|
Вот инфа, которую я достал из сниффа:
Код:
#q11940 npc=26127 + 01.02.2011 2:19:58 46607 [SPELL_EFFECT_APPLY_AURA] [TARGET_DUELVSPLAYER] [SPELL_AURA_DUMMY] P->U - 25 c. - Драконий гарпун + 01.02.2011 2:20:00 46620 [SPELL_EFFECT_APPLY_AURA] [TARGET_DUELVSPLAYER] [SPELL_AURA_DUMMY] P->U - 10 c. - Красная драконья кровь + 01.02.2011 2:20:11 46673 [SPELL_EFFECT_DUMMY] [TARGET_DUELVSPLAYER] P->U - Инициатор захвата + 01.02.2011 2:20:11 46675 [SPELL_EFFECT_APPLY_AURA] [TARGET_SELF] [SPELL_AURA_DUMMY] 3 m. - Подчинение + SCRIPT + 01.02.2011 2:20:11 46678 [SPELL_EFFECT_APPLY_AURA] [TARGET_SELF] [SPELL_AURA_PERIODIC_TRIGGER_SPELL] = 43391 - Рвота дракона, периодический эффект + 01.02.2011 2:20:11 46691 [SPELL_EFFECT_APPLY_AURA] [TARGET_DUELVSPLAYER] [SPELL_AURA_DUMMY] U->P - 3m. - Детеныш дракона покорен + 01.02.2011 2:20:11 46674 [SPELL_EFFECT_APPLY_AURA] [TARGET_DUELVSPLAYER] [SPELL_AURA_DUMMY] U->P - Луч-веревка 01.02.2011 2:20:31 43391 [SPELL_EFFECT_DUMMY] [TARGET_SELF] 01.02.2011 2:20:44 46696 [SPELL_EFFECT_DUMMY] [TARGET_DUELVSPLAYER] P->U - Возвращение дракона 01.02.2011 2:20:47 46702 [SPELL_EFFECT_DUMMY] [TARGET_DUELVSPLAYER] U->npc=26117 - Сигнал завершения дракона npc=26117 01.02.2011 2:20:47 46704 [SPELL_EFFECT_DUMMY] [TARGET_SCRIPT] self - 2.5 c. - Огненный шар Релораза 01.02.2011 2:20:47 26117->26127 Language: Universal, MonsterSay=Детеныш дракона Нексуса 01.02.2011 2:20:50 46703 [SPELL_EFFECT_APPLY_AURA] [TARGET_SELF] [SPELL_AURA_DUMMY] - Завершение испепеления 01.02.2011 2:20:50 Emote: EMOTE_ONESHOT_WOUNDCRITICAL (34) npc=26175 01.02.2011 2:20:43 46693 [SPELL_EFFECT_SCRIPT_EFFECT] [TARGET_DUELVSPLAYER] U->P - Снятие аур 01.02.2011 2:20:43 killcredit=26175 Код:
diff --git a/src/game/SpellAuras.cpp b/src/game/SpellAuras.cpp index 9d00d56..4b2078c 100644 --- a/src/game/SpellAuras.cpp +++ b/src/game/SpellAuras.cpp @@ -2018,6 +2018,25 @@ void Aura::HandleAuraDummy(bool apply, bool Real) case 43873: // Headless Horseman Laugh target->PlayDistanceSound(11965); return; + case 46607: // Drake Harpoon + if (target->GetTypeId() != TYPEID_UNIT) + return; + + if (Unit* caster = GetCaster()) + // Red Dragonblood + caster->CastSpell(target, 46620, true, NULL, this); + + return; + case 46675: + if (target->GetTypeId() != TYPEID_UNIT) + return; + + target->AttackStop(); + target->CombatStop(true); + target->getHostileRefManager().deleteReferences(); + target->setFaction(35); + // allow script for the process of returning the NPC + return; case 46699: // Requires No Ammo if (target->GetTypeId() == TYPEID_PLAYER) // not use ammo and not allow use @@ -8727,6 +8746,20 @@ void SpellAuraHolder::HandleSpellSpecificBoosts(bool apply) { switch(GetId()) { + case 46620: // Red Dragonblood + { + if(Unit* caster = GetCaster()) + if (caster->GetTypeId() == TYPEID_PLAYER && caster->isAlive() && m_target->GetTypeId() == TYPEID_UNIT && m_target->isAlive()) + if (apply) + ((Creature*)m_target)->AI()->AttackStart(caster); + else + { + int32 bp = 1; + // Capture Trigger + caster->CastCustomSpell(m_target, 46673, &bp, NULL, NULL, true, NULL, NULL, GetCasterGuid()); + } + return; + } case 50720: // Vigilance (warrior spell but not have warrior family) { spellId1 = 68066; // Damage Reduction diff --git a/src/game/SpellEffects.cpp b/src/game/SpellEffects.cpp index 2e52e48..3dbc6cd 100644 --- a/src/game/SpellEffects.cpp +++ b/src/game/SpellEffects.cpp @@ -1499,6 +1499,24 @@ void Spell::EffectDummy(SpellEffectIndex eff_idx) unitTarget->SetHealth(0); return; } + case 46673: // Capture Trigger + { + if (!m_caster || !unitTarget || m_caster->GetTypeId() != TYPEID_PLAYER || unitTarget->GetTypeId() != TYPEID_UNIT) + return; + + // Subdued + unitTarget->CastSpell(unitTarget, 46675, true); + // Drake Vomit, Periodic + unitTarget->CastSpell(unitTarget, 46678, true); + // Drake Hatchling Subdued + unitTarget->CastSpell(m_caster, 46691, true); + } + case 46691: // Drake Hatchling Subdued + { + // Rope Beam + unitTarget->CastSpell(m_caster, 46674, true); + unitTarget->GetMotionMaster()->MoveFollow(m_caster, PET_FOLLOW_DIST, PET_FOLLOW_ANGLE); + } case 46797: // Quest - Borean Tundra - Set Explosives Cart { if (!unitTarget) |
02.03.2011, 11:55 | #12 |
Администратор
|
Суть квеста: используем итем на нпц, после чего приводим его к квестгиверу.
Часть будет в ядре, часть в СД2. Если с выходом из боя проблема решена, то остается сделать часть "приводим его к квестгиверу". Как я понимаю, это лучше делать в СД2. Возможно, вывод нпц из боя и смена фракции также надо делать в СД2. Видел примеры на сопровождение в СД2, попробую сделать также. |
06.03.2011, 00:01 | #13 |
Администратор
|
Получилось вывести нпц из боя, теперь возник вопрос сопровождения, пример СД2 не дал нужного эффекта:
Код:
if (pCreatureTarget->GetMotionMaster()->GetCurrentMovementGeneratorType() == WAYPOINT_MOTION_TYPE) pCreatureTarget->GetMotionMaster()->MoveIdle(); pCreatureTarget->GetMotionMaster()->MoveFollow(pCaster, PET_FOLLOW_DIST, PET_FOLLOW_ANGLE); В этот момент нпц просто возвращается на свое предыдущее место, но не следует за игроком. Что упущено в реализации сопровождения нпц за игроком? |
06.03.2011, 10:01 | #14 |
Ученый
Регистрация: 07.03.2010
Сообщений: 138
Сказал(а) спасибо: 200
Поблагодарили 143 раз(а) в 49 сообщениях
|
А
Код:
if (!m_creature->SelectHostileTarget() || !m_creature->getVictim()) return; |
06.03.2011, 10:36 | #15 |
Администратор
|
UpdateAI пока нет вообще.
В примере на сопровождение не нашел там ничего, что было бы связано с движением нпц, поэтому пока не добавлял. |
06.03.2011, 10:39 | #16 |
Администратор
|
На текущий момент код СД2 выглядит так:
Код:
/*###### ## npc_nexus_drake_hatchling ######*/ enum { SPELL_CAPTURE_TRIGGER = 46673, SPELL_SUBDUED = 46675, SPELL_DRAKE_VOMIT_PERIODIC = 46678, SPELL_DRAKE_HATCHLING_SUBDUED = 46691 }; struct MANGOS_DLL_DECL npc_nexus_drake_hatchlingAI : public ScriptedAI { npc_nexus_drake_hatchlingAI(Creature* pCreature) : ScriptedAI(pCreature) { Reset(); } uint32 m_uiDespawnTimer; void Reset() { m_uiDespawnTimer = 0; } }; bool EffectDummyCreature_npc_nexus_drake_hatchling(Unit* pCaster, uint32 spellId, SpellEffectIndex effIndex, Creature* pCreatureTarget) { //always check spellid and effectindex if (spellId == SPELL_CAPTURE_TRIGGER && effIndex == EFFECT_INDEX_0) { if (!pCaster || pCaster->GetTypeId() != TYPEID_PLAYER || !pCaster->isAlive()) return true; //no effect if player/creature already have aura from spells if (pCaster->HasAura(SPELL_DRAKE_HATCHLING_SUBDUED) || pCreatureTarget->HasAura(SPELL_SUBDUED)) return true; pCreatureTarget->CastSpell(pCreatureTarget, SPELL_SUBDUED, true); pCreatureTarget->CastSpell(pCreatureTarget, SPELL_DRAKE_VOMIT_PERIODIC, true); pCreatureTarget->CastSpell(pCaster, SPELL_DRAKE_HATCHLING_SUBDUED, true); if (pCreatureTarget->GetMotionMaster()->GetCurrentMovementGeneratorType() == WAYPOINT_MOTION_TYPE) pCreatureTarget->GetMotionMaster()->MoveIdle(); pCreatureTarget->GetMotionMaster()->MoveFollow(pCaster, PET_FOLLOW_DIST, PET_FOLLOW_ANGLE); //always return true when we are handling this spell and effect } return true; } CreatureAI* GetAI_npc_nexus_drake_hatchling(Creature* pCreature) { return new npc_nexus_drake_hatchlingAI(pCreature); } |
06.03.2011, 11:38 | #17 |
Ученый
Регистрация: 10.03.2010
Адрес: Бобруйск
Сообщений: 284
Сказал(а) спасибо: 213
Поблагодарили 98 раз(а) в 84 сообщениях
|
Может быть вот так ?
Код:
if (pCreatureTarget->IsWithinDistInMap(pCaster, pCreatureTarget->GetMap()->GetVisibilityDistance())) { pCreatureTarget->GetMotionMaster()->MoveFollow(pCaster, PET_FOLLOW_DIST, PET_FOLLOW_ANGLE); pCreatureTarget->AddSplineFlag(SPLINEFLAG_WALKMODE); } |
06.03.2011, 13:04 | #18 |
Администратор
|
Все равно нпц возвращается на место и не следует за игроком.
|
06.03.2011, 13:20 | #19 |
Ученый
Регистрация: 10.03.2010
Адрес: Бобруйск
Сообщений: 284
Сказал(а) спасибо: 213
Поблагодарили 98 раз(а) в 84 сообщениях
|
Случаем, перед:
Код:
pCreatureTarget->CastSpell(pCreatureTarget, SPELL_SUBDUED, true); pCreatureTarget->CastSpell(pCreatureTarget, SPELL_DRAKE_VOMIT_PERIODIC, true); pCreatureTarget->CastSpell(pCaster, SPELL_DRAKE_HATCHLING_SUBDUED, true); Код:
if (pCreatureTarget->GetEntry() == ?) |
06.03.2011, 13:25 | #20 |
Администратор
|
В ядре каст идет на конкретного нпц.
Если выделить нпц и .cast target 46675, то на нпц появляется баф, после чего нпц начинает следовать за игроком. Получается, что проблема в том, что баф не вешается, хотя каст происходит. |
06.03.2011, 15:17 | #21 |
Администратор
|
Все портит каст спелла 46691.
Код:
// Subdued unitTarget->CastSpell(unitTarget, 46675, true); // Drake Vomit, Periodic unitTarget->CastSpell(unitTarget, 46678, true); // Drake Hatchling Subdued unitTarget->CastSpell(m_caster, 46691, true); При касте нпц спелла 46675 на себя вешается баф, затем нпц кастует на игрока 46691. В итоге на игроке появляется баф спелла 46691, а с нпц слетает баф 46675, хотя цели разные, только кастер один. |
07.03.2011, 19:41 | #22 |
Администратор
|
Удаление ауры 46675 идет в:
Код:
// If holder in use (removed from code that plan access to it data after return) // store it in holder list with delayed deletion if (holder->IsInUse()) { holder->SetDeleted(); m_deletedHolders.push_back(holder); } else delete holder; Если каст спеллов поменять местами, т.е. 46675 после 46691, то оба бафа накладываются нормально. Может ли это быть связано с тем, что у 46675 есть обработка эффекта, которая отработала/не отработала? |
|
|
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Area-ауры и иммунитет | zergtmn | Баг-репорты | 1 | 05.05.2010 07:42 |