|
|
Модератор форума: Dimitro |
Форум TrinityCore [TrinityCore] Help НПС которых надо сопровождать можно атаковать АОЕ спеллами |
НПС которых надо сопровождать можно атаковать АОЕ спеллами |
НПС которых надо сопровождать можно атаковать АОЕ спелламинапример Kayra Longmane в Zangarmarsh при сопровождении атакуется любыми АОЕ спеллами как только она вступает в бой с мобами
выставление флага unit_flags = 256 (OOC_NOT_ATTACKABLE) в ДБ не помогает как только НПС вступает в бой с мобами его можно бить АОЕ спеллами
Если помог, ставь плюсик в репу :)
Сообщение # 1 написано 11.01.2017 в 11:58
|
Только АОЕ или вообще?
Если только АОЕ - простой вариант - заскриптовать всех эскорт на неполучение урона (плохой вариант). Более простой вариант - иммун к спелам АоЕ урона. Хороший вариант - переработка выбора целей АоЕ спеллов. Копать в механику распределения целей.
Сообщение # 5 написано 11.01.2017 в 22:17
|
мнде
а конкретнее? механику копать такой совет сродни - "ищи в ядре" - ну та же фигня нужно чтобы при вступлении НПСа в бой при его эскортировании, игроки не могли задеть его АОЕ спеллами и соответственно не испортили прохождение ведь эскортируемого нужно защищать и если его стукнуть (например Kayra Longmane в Zangarmarsh или Thrall в Old Hillsbrad) то дальше уже эскортирование будет невозможно так как НПС будет заагрен на игрока и двигаться дальше по маршруту не станет Добавлено (16.01.2017, 13:48) Код bool Unit::isAttackableByAOE(float x, float y, float z, bool LosCheck) const { if (!IsAlive()) return false; if (HasFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE | UNIT_FLAG_NOT_SELECTABLE | UNIT_FLAG_IMMUNE_TO_PC)) return false; if (GetTypeId() == TYPEID_PLAYER && ToPlayer()->IsGameMaster()) return false; if (LosCheck) if (!IsWithinLOS(x, y, z)) return false; return !isInFlight(); } Но как сделать так чтобы дружественные НПС всегда были вне АОЕ дамага? Добавлено (16.01.2017, 13:55)
Если помог, ставь плюсик в репу :)
|
это Орегон
там сборная солянка из Мангоса и Тринити кстати есть ещё одна проблема - точнее две 1) Да сюда можно нафигачит тупо проверку на Эскортирование но этого мало - есть например ещё мобы на Кельданасе по которым так же фигня лупит АОЕ при чём даже не в бою можно урон нанести 2) Даже если поставить проверку на фракцию и перекрыть возможность в принципе то возникает проблема с големами - они же должны атаковать игрока если тот устроит ПВП - теперь получается что голем игрока атакует а аое на него не действуют - тоже не правильно
Если помог, ставь плюсик в репу :)
Сообщение # 8 написано 16.01.2017 в 14:19
|
И что там за проблема?
Код if (check->IsControlledByPlayer()) { if (check->IsFriendlyTo(itr->GetSource())) continue; } else { if (!check->IsHostileTo(itr->GetSource())) continue; } IsControlledByPlayer это чек контролируется ли цель игроком - по-моему вообще ничего общего Добавлено (17.01.2017, 14:27)
Если помог, ставь плюсик в репу :)
|
IsControlledByPlayer это чек контролируется ли цель игроком - по-моему вообще ничего общего Надо проверить, срабатывает ли эта проверка. Если да, тогда понятно почему АОЕ может наносить урон по таргетам, которые имеют нейтральную реакцию к кастеру. ещё вопрос - где прописано поведение големов на Кельданасе? ну тот факт что они становятся красными если игрок устраивает ПВП нигде не могу найти - даже больше скажу - големы эти не являются в базе Стражниками - тоесть флаг на Guard у них не стоит и GuardAI у них не про писан но тем не менее они атакуют игроков когда те в пвп где кусок кода отвечающий за это я не понимаю Это особенный флаг у фракции, берется из ДБЦ. OregonCore rev. 2c4336c047 Unit.cpp строка 7025 - Собственно тот самый кусок кода
Сообщение # 12 написано 18.01.2017 в 05:20
|
Провёл маленький эксперимент
в bool Unit::canAttack(Unit const* target, bool force) const вписал следующий код: Код if (GetReactionTo(target) > REP_NEUTRAL || target->GetReactionTo(this) > REP_NEUTRAL) { sLog.outError("1"); return false; } Так вот выяснилось что ВРАЖДЕБНЫЕ мобы почему то попадают в это условие хотя у них GetReactionTo должно возвращать REP_HOSTILE Я в ступоре
Если помог, ставь плюсик в репу :)
Сообщение # 13 написано 18.01.2017 в 09:34
|
вобщем жопа
я хз как работать с дебагом а сам я найти проблему не могу максимум что удалось сделать это убрать аое урон по мобам которых нельзя атаковать в принципе и оставить по агрессивным - но отсюда вылезла дургая проблема: нейтралы которые доступны для атаки стали почему-то бросаться на игрока хотя я вообще ничего такого не задавал Добавлено (19.01.2017, 15:24) Код bool Unit::canAttack(Unit const* target, bool force) const { ASSERT(target); if (!target->IsHostileToPlayers() && GetReactionTo(this) >= REP_NEUTRAL) { if (FactionEntry const* factionEntry = sFactionStore.LookupEntry(GetFactionTemplateEntry()->faction)) { if (factionEntry->CanHaveReputation()) { sLog.outError("Friendly"); return false; } } } if (!target->IsHostileToPlayers() && GetReactionTo(target) < REP_NEUTRAL) { sLog.outError("Hostile"); return true; } // feign dead case if (target->HasFlag(UNIT_FIELD_FLAGS_2, UNIT_FLAG2_FEIGN_DEATH)) { if ((GetTypeId() != TYPEID_PLAYER && !GetOwner()) || (GetOwner() && GetOwner()->GetTypeId() != TYPEID_PLAYER)) return false; // if this == player or owner == player check other conditions } // real dead case ~UNIT_FLAG2_FEIGN_DEATH && UNIT_STATE_DIED else if (target->HasUnitState(UNIT_STATE_DIED)) return false; return true; } bool Unit::isAttackableByAOE(float x, float y, float z, bool LosCheck) const { if (!IsAlive()) return false; if (!canAttack(this)) { sLog.outError("AOE Hostile FALSE"); return false; } if ((IsAIEnabled && ToCreature()->AI()->IsEscorted())) return false; if (HasFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE | UNIT_FLAG_NOT_SELECTABLE | UNIT_FLAG_IMMUNE_TO_PC)) return false; if (GetTypeId() == TYPEID_PLAYER && ToPlayer()->IsGameMaster()) return false; if (LosCheck) if (!IsWithinLOS(x, y, z)) return false; return !isInFlight(); }
Если помог, ставь плюсик в репу :)
Сообщение # 15 написано 19.01.2017 в 15:24
|
ну хз
сделать GetReactionTo(target) ? toPlayer() использовать нельзя - серв падает Добавлено (20.01.2017, 01:05) --------------------------------------------- и подозреваю что агриться нейтралы на игрока не перестанут от этого Добавлено (20.01.2017, 17:29) --------------------------------------------- Вот в таком виде всё номр только агрессивных големов на Келе (когда бьёшь кого-то из противоположной фракции) невозможно бить ни ударами ни масс кастами а он игрока бить может! Код bool Unit::canAttack(Unit const* target, bool force) const { ASSERT(target); if (force) { if (IsFriendlyTo(target)) return false; } else if (!IsHostileTo(target)) return false; if (!target->isAttackableByAOE()) return false; // feign dead case if (target->HasFlag(UNIT_FIELD_FLAGS_2, UNIT_FLAG2_FEIGN_DEATH)) { if ((GetTypeId() != TYPEID_PLAYER && !GetOwner()) || (GetOwner() && GetOwner()->GetTypeId() != TYPEID_PLAYER)) return false; // if this == player or owner == player check other conditions } // real dead case ~UNIT_FLAG2_FEIGN_DEATH && UNIT_STATE_DIED else if (target->HasUnitState(UNIT_STATE_DIED)) return false; return true; } bool Unit::isAttackableByAOE(float x, float y, float z, bool LosCheck) const { if (!IsAlive()) return false; if (FactionEntry const* factionEntry = sFactionStore.LookupEntry(GetFactionTemplateEntry()->faction)) { if (factionEntry->CanHaveReputation()) { if (!this->IsHostileToPlayers()) { sLog.outError("CanHaveReputation Friendly"); return false; } } } if ((IsAIEnabled && ToCreature()->AI()->IsEscorted())) return false; if (HasFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE | UNIT_FLAG_NOT_SELECTABLE | UNIT_FLAG_IMMUNE_TO_PC)) return false; if (GetTypeId() == TYPEID_PLAYER && ToPlayer()->IsGameMaster()) return false; if (LosCheck) if (!IsWithinLOS(x, y, z)) return false; return !isInFlight(); } Добавлено (25.01.2017, 17:55) Добавлено (27.01.2017, 09:42)
Если помог, ставь плюсик в репу :)
|
| |||
| |||