• Страница 1 из 1
  • 1
Модератор форума: Dimitro  
НПС которых надо сопровождать можно атаковать АОЕ спеллами
Stormtrooper
Командир
НПС которых надо сопровождать можно атаковать АОЕ спелламинапример Kayra Longmane в Zangarmarsh при сопровождении атакуется любыми АОЕ спеллами как только она вступает в бой с мобами

выставление флага unit_flags = 256 (OOC_NOT_ATTACKABLE) в ДБ не помогает
как только НПС вступает в бой с мобами его можно бить АОЕ спеллами
Если помог, ставь плюсик в репу :)

Сообщение # 1 написано 11.01.2017 в 11:58
Pallam
Рыцарь
unit_flags = 256 (OOC_NOT_ATTACKABLE)
OOC - out of combat
Или флаг "неатакуемости" постоянно, или я не понял, чего вы добиваетесь.
Сообщение # 2 написано 11.01.2017 в 19:22
Stormtrooper
Командир
Цитата Stormtrooper ()
выставление флага unit_flags = 256 (OOC_NOT_ATTACKABLE) в ДБ не помогаеткак только НПС вступает в бой с мобами его можно бить АОЕ спеллами

мне нужно чтобы его нельзя было атаковать АОЕ спеллами со стороны игрока
Если помог, ставь плюсик в репу :)

Сообщение # 3 отредактировано Stormtrooper - Среда, 11.01.2017, 20:22
Gamesbx
Капрал
копай в механике а не в флагах
Team Gamesbx Core - разработка ядер и исходников wow 3.3.5 - 4.3.4 - 5.4.8 - 6.2.3 (группа в VK - https://vk.com/public109538784 )
Сообщение # 4 написано 11.01.2017 в 21:39
Pallam
Рыцарь
Только АОЕ или вообще?
Если только АОЕ - простой вариант - заскриптовать всех эскорт на неполучение урона (плохой вариант). Более простой вариант - иммун к спелам АоЕ урона.
Хороший вариант - переработка выбора целей АоЕ спеллов. Копать в механику распределения целей.
Сообщение # 5 написано 11.01.2017 в 22:17
Stormtrooper
Командир
мнде smile
а конкретнее?
механику копать
такой совет сродни - "ищи в ядре" - ну та же фигня
нужно чтобы при вступлении НПСа в бой при его эскортировании, игроки не могли задеть его АОЕ спеллами и соответственно не испортили прохождение
ведь эскортируемого нужно защищать и если его стукнуть (например 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)
---------------------------------------------
Сразу уточню - UNIT_FLAG_IMMUNE_TO_PC - это как раз OOC_NOT_ATTACKABLE - тоесть ВНЕ боя
а надо чтобы и в бою тоже работало

Если помог, ставь плюсик в репу :)

Сообщение # 6 отредактировано Stormtrooper - Четверг, 12.01.2017, 09:26
Incorrect
Капрал
Какая ревизия ядра? Не вижу вообще таких методов на свежей.
Сообщение # 7 написано 16.01.2017 в 13:58
Stormtrooper
Командир
это Орегон
там сборная солянка из Мангоса и Тринити
кстати есть ещё одна проблема - точнее две
1) Да сюда можно нафигачит тупо проверку на Эскортирование но этого мало - есть например ещё мобы на Кельданасе по которым так же фигня лупит АОЕ при чём даже не в бою можно урон нанести
2) Даже если поставить проверку на фракцию и перекрыть возможность в принципе то возникает проблема с големами - они же должны атаковать игрока если тот устроит ПВП - теперь получается что голем игрока атакует а аое на него не действуют - тоже не правильно
Если помог, ставь плюсик в репу :)

Сообщение # 8 написано 16.01.2017 в 14:19
Pallam
Рыцарь
Не на фракцию, а на реакцию проверяй. Вариант, в принципе.
Сообщение # 9 написано 16.01.2017 в 18:52
Incorrect
Капрал
OregonCore rev. 2c4336c047 Spell.h строка 758

Думаю проблема здесь. Но это раздел TrinityCore.
Сообщение # 10 написано 17.01.2017 в 09:19
Stormtrooper
Командир
И что там за проблема?


Код
if (check->IsControlledByPlayer())
                    {
                        if (check->IsFriendlyTo(itr->GetSource()))
                            continue;
                    }
                    else
                    {
                        if (!check->IsHostileTo(itr->GetSource()))
                            continue;
                    }

IsControlledByPlayer это чек контролируется ли цель игроком - по-моему вообще ничего общего

Добавлено (17.01.2017, 14:27)
---------------------------------------------
ещё вопрос - где прописано поведение големов на Кельданасе?
ну тот факт что они становятся красными если игрок устраивает ПВП
нигде не могу найти - даже больше скажу - големы эти не являются в базе Стражниками - тоесть флаг на Guard у них не стоит и GuardAI у них не про писан но тем не менее они атакуют игроков когда те в пвп
где кусок кода отвечающий за это я не понимаю

Если помог, ставь плюсик в репу :)

Сообщение # 11 отредактировано Stormtrooper - Вторник, 17.01.2017, 13:40
Incorrect
Капрал
Цитата Stormtrooper ()
IsControlledByPlayer это чек контролируется ли цель игроком - по-моему вообще ничего общего


Надо проверить, срабатывает ли эта проверка. Если да, тогда понятно почему АОЕ может наносить урон по таргетам, которые имеют нейтральную реакцию к кастеру.

Цитата Stormtrooper ()
ещё вопрос - где прописано поведение големов на Кельданасе?
ну тот факт что они становятся красными если игрок устраивает ПВП
нигде не могу найти - даже больше скажу - големы эти не являются в базе Стражниками - тоесть флаг на Guard у них не стоит и GuardAI у них не про писан но тем не менее они атакуют игроков когда те в пвп
где кусок кода отвечающий за это я не понимаю


Это особенный флаг у фракции, берется из ДБЦ.

OregonCore rev. 2c4336c047 Unit.cpp строка 7025 - Собственно тот самый кусок кода
Сообщение # 12 написано 18.01.2017 в 05:20
Stormtrooper
Командир
Провёл маленький эксперимент
в 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
Incorrect
Капрал
Собирай в дебаге и с отладчиком смотри почему так получается
Сообщение # 14 написано 18.01.2017 в 10:49
Stormtrooper
Командир
вобщем жопа
я хз как работать с дебагом а сам я найти проблему не могу
максимум что удалось сделать это убрать аое урон по мобам которых нельзя атаковать в принципе и оставить по агрессивным - но отсюда вылезла дургая проблема: нейтралы которые доступны для атаки стали почему-то бросаться на игрока хотя я вообще ничего такого не задавал

Добавлено (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
Incorrect
Капрал
Цитата Stormtrooper ()
GetReactionTo(this)


Проверяешь реакцию юнита самого к себе, она всегда будет REP_FRIENDLY. Возможно, проблема в этом, дальше не смотрел
Сообщение # 16 написано 19.01.2017 в 17:39
Stormtrooper
Командир
ну хз
сделать 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)
---------------------------------------------
Up UP sad

Если помог, ставь плюсик в репу :)

Сообщение # 17 отредактировано Stormtrooper - Пятница, 20.01.2017, 17:30
  • Страница 1 из 1
  • 1
Поиск: