Ru-MaNGOS

Ru-MaNGOS (http://mangos.ytdb.ru/index.php)
-   Новичкам (http://mangos.ytdb.ru/forumdisplay.php?f=40)
-   -   Проблема с добавлением скилла боссу (http://mangos.ytdb.ru/showthread.php?t=4694)

Zamir 10.06.2011 10:22

Здравствуйте. Я совсем еще новичек, недавно скачал чистые исходники и начал копаться в коде. Нашел в сд2 пустой скрипт малигоса, решил потренироваться на нем, добавить ему дыхание и текст от лоскутика. Текст при пуле и смерти босса срабатывал исправно, но вот дыхание почему-то не работало. Ид спелла 56272 я взял из скрипта малигоса из исходников rsa.
Гугл, ytdb вики о таблицах базы и поиск по форуму ничего не дали. Возможно я пропустил что-то важное. Например, добавить указанный спелл в базу или что-то подобное. Помогите =(
Код:

#include "precompiled.h"
enum
{
        SPELL_ARCANE_BREATH            = 56272, // Дыхание

        SAY_AGGRO                                                = -1533017, // пул лоскутика
        SAY_DEATH                                                = -1533020, // смерть лоскутика
};

struct MANGOS_DLL_DECL boss_malygosAI : public ScriptedAI
{
    boss_malygosAI(Creature* pCreature) : ScriptedAI(pCreature)
    {
        Reset();
    }
        uint32 m_uiArcaneBreathTimer;

        void Reset()
        {
                m_uiArcaneBreathTimer = 10000;
        }

        void Aggro(Unit* pWho)
    {
        DoScriptText(SAY_AGGRO, m_creature);
        // m_creature->RemoveSplineFlag(SPLINEFLAG_FLYING);
    }

    void JustDied(Unit* pKiller)
    {
        DoScriptText(SAY_DEATH, m_creature);
    }
       
        void UpdateAI(const uint32 uiDiff)
    {
        if (!m_creature->SelectHostileTarget() || !m_creature->getVictim())
            return;

        // Дыхание
        if (m_uiArcaneBreathTimer < uiDiff)
        {
                        if (DoCastSpellIfCan(m_creature->getVictim(), SPELL_ARCANE_BREATH) == CAST_OK)
                        {
                                m_uiArcaneBreathTimer = 10000;
                                DoScriptText(SAY_DEATH, m_creature); // проверка, срабатывает ли код вообще
                        }
        }
                else
                        m_uiArcaneBreathTimer -= uiDiff;

                // Мили атака
        DoMeleeAttackIfReady();
    }
};
CreatureAI* GetAI_boss_malygos(Creature* pCreature)
{
    return new boss_malygosAI(pCreature);
}
void AddSC_boss_malygos()
{
        Script *newscript;

    newscript = new Script;
    newscript->Name = "boss_malygos";
    newscript->GetAI = &GetAI_boss_malygos;
    newscript->RegisterSelf();
}

Вставлял другие спеллы вроде дыхания ониксии, халиона и синдрагосы - кастует. Но вот именно собственный 56272 не хочет никак.

rsa 10.06.2011 15:14

Пожалуйста, почитайте мануалы или хотя бы сырцы с которыми вы пытаетесь извращаться. вы пробуете
DoCastSpellIfCan(m_creature->getVictim(),
а у спелла -
SpellRange: (Id 1) "Self Only":
в итоге будете всегда получать облом.

Zamir 10.06.2011 16:21

Спасибо, изменил на m_creature. Но не помогло. Или надо было сделать что-то другое?

Стал использовать гмом этот скилл через .cast, написало, что должен находиться в другой зоне (в Хотя другие аналогичные скиллы срабатывали везде.
Можно ли сделать так, чтобы данный скилл можно было использовать не только в eye of eternity?

*скачал другой спеллворк.

Lordronn 10.06.2011 19:21

Спелл идет селфкастом, т.е автоматом кастится на кастера. При касте можешь указывать что хочешь, проблему это не решит. Нужен другой spellId, либо же хакать этот(ставить таргетИД другой), но вряд ли это поможет, на оффе наверное этот спелл триггерит что-то другое

MaxXx2021 11.06.2011 19:33

Дело тут не в таргете, Спелл кастуется игроком, но нет визуального эффекта дыхания. Если же боссом не кастуется попробуй ввести каст вот так "m_creature->CastSpell(m_creature, SPELL_BREATH, false); ! Встречал некоторые спеллы котороые не кастуются при DoCastSpellIfCan или DoCast.

Zamir 11.06.2011 22:26

Хм, спасибо всем.
У меня возник другой вопрос. Писал скрипт для саурфанга, застрял на спелле Boiling Blood (72385), босс его использует не на одну цель, а на всех в радиусе видимости. Через .cast в игре то же самое.
В dbc написано Targets (22,15) (TARGET_CASTER_COORDINATES,TARGET_ALL_ENEMY_IN_ARE A). Перечитал кучу информации, но так и не узнал, как исправить скилл. В готовых скриптах саурфанга тоже ничего не нашел, код в функции UpdateUI идентичен. Искал в разных исходниках файлы, в которых упоминается 72385, не нашел. Но как-то у других этот скилл работает на одну цель. Пожалуйста, объясните)

Код:


        void UpdateAI(const uint32 uiDiff)
      {

                //Spell Boiling Blood
                if (m_uiBoilingBloodTimer <= uiDiff)
                {
                        if (Unit *pTargetBB = m_creature->SelectAttackingTarget(ATTACKING_TARGET_RANDOM, 1))
                        {
                                DoCast(pTargetBB, SPELL_BOILING_BLOOD_1);
                                m_uiBoilingBloodTimer = 16000;
                        }

                }
                else
                        m_uiBoilingBloodTimer -= uiDiff;

        m_uipower = m_creature->GetPower(POWER_ENERGY);
        DoMeleeAttackIfReady();
        }


Покопался в англоязычном гугле, обнаружил несколько переделанных файлов Spellmgr.cpp, где делалось что-то вроде

SpellEntry* spellinfo = sSpellStore.LookupEntry(i);

spellInfo->EffectImplicitTargetA[0] = TARGET_UNIT_TARGET_ENEMY;
spellInfo->EffectImplicitTargetB[0] = 0;

У меня такое сделать не получается, тк spellinfo можно сделать только константой.

Zamir 12.06.2011 13:30

Пришлось изменять запись в spell.dbc, так как я не знаю, как реализовать этот спелл на чистых исходниках.

Lordronn 12.06.2011 18:15

1. Есть в коде такая функция как LoadCustomAttribute - вроде так. Там можно менять спеллы в ядре без изменения в ДБЦ
2. Ты не правильно понял как он работает. Саурфанг вешает ауру 72385 на игрока. Та в свою очередь наносит урон в радиусе. А ты видимо подумал что кастуется на всех в радиусе

Код:

                if (uiBoilingBloodTimer < uiDiff)
                {
                    if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 1, 100.0f, true))
                        DoCast(target, SPELL_BOILING_BLOOD);
                    uiBoilingBloodTimer = 25000;
                } else uiBoilingBloodTimer -= uiDiff;

Вообще если тебе интересно, то вот мой код саурфанга на ТС(писался давно и заброшен уже

https://bitbucket.org/bolvor/icecrow...r_saurfang.cpp

Zamir 12.06.2011 21:51

У меня почему-то нет некоторых функций, например той же SelectTarget. Скачивал исходники с https://github.com/mangos/mangos.

Lordronn 12.06.2011 22:32

Цитата:

Сообщение от Zamir (Сообщение 23335)
У меня почему-то нет некоторых функций, например той же SelectTarget. Скачивал исходники с https://github.com/mangos/mangos.

Цитата:

то вот мой код саурфанга на ТС
я же написал, что я писал это для ядра тринити

Zamir 13.06.2011 00:04

А, да. Ладно, функции вроде LoadCustomAttributes или других вариаций я не нашел. Разве что ткнете меня в нее носом.
Порылся в spell.cpp, нашел функцию SetTargetMap. Записал туда:

Код:

case 72385:                    // Boiling Blood (Deathbringer Saurfang)
    unMaxTargets = 1;
    break;

Вроде заработало, кидается на 1 цель. Теперь сел за реализацию blood nova. Скилл должен кидаться на рдд, если их достаточное кол-во, иначе в мили. Пока я написал так, но может быть есть более изящный вариант кода, какая-нибудь функция, которую я не знаю. И еще проблема - список целей постоянный, это значит, что при нахождении рдд скилл будет кидаться всегда в одного и того же человека. Как можно сделать рандомную выборку из списка?
Код:

if (m_uiBloodNovaTimer <= uiDiff)
{
    bool bFound = false;
    Map* pMap = m_creature->GetMap();
    Map::PlayerList const& pPlayers = pMap->GetPlayers();
    if (!pPlayers.isEmpty())
    {
        for (Map::PlayerList::const_iterator itr = pPlayers.begin(); itr != pPlayers.end(); ++itr)
        {
            Unit* pTargetBN = itr->getSource();
            if (pTargetBN && pTargetBN->IsInWorld())
            {
                if (m_creature->GetDistance(pTargetBN->GetPositionX(), pTargetBN->GetPositionY(), pTargetBN->GetPositionZ()) > m_fRangeDist)
                {
                    DoCast(pTargetBN, SPELL_BLOOD_NOVA);
                    bFound = true;
                    m_uiBloodNovaTimer = 10000;
                }
                                               
            }
        }
        if (!bFound)
        {
            DoCast(m_creature->getVictim(), SPELL_BLOOD_NOVA);
            m_uiBloodNovaTimer = 10000;
        }

    }
}
else
    m_uiBloodNovaTimer -= uiDiff;


Lordronn 13.06.2011 00:09

Нет. Там рандом идет. Кол-во рандомных целей зависит от сложности

Код:

                if (uiBloodNovaTimer < uiDiff)
                {
                    //                                          10N  25N  10H  25H
                    for (uint8 i = 1; i <= RAID_MODE(1,    3,    1,    3); ++i)
                        if(Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 1, 100.0f, true))
                            DoCast(target, SPELL_BLOOD_NOVA);
                    uiBloodNovaTimer = 30000;
                } else uiBloodNovaTimer -= uiDiff;


Zamir 13.06.2011 00:14

Эээ, вы не путаете его со скиллом boiling blood? Это он должен просто кидаться на несколько рандомных целей, кол-во зависит от сложности.
Но blood nova 72378 кидается аналогично губительному газу тухлопуза - на рдд (минимальное кол-во зависит от сложности), если их достаточно, иначе на мили. Поэтому на саурфанге рдд и стоят с /range 12-15.
У меня нет волшебной функции SelectTarget для выборки целей в радиусе или я не знаю ее аналога в мангосе. Пришлось писать объемный код.

Zamir 13.06.2011 07:57

Смотрел код тринити, там для этого использовалась сортировка всего списка игроков по их удаленности до босса, начиная с самых дальних. Потом перебором от самых дальних находился первый игрок с дистанцией меньше положеной, кол-во игроков до этого момента сохранялось в переменной. Потом через std::advance итератор рандомно ставился между началом списка и этой переменной, так получали рандомную цель в рдд. У меня почему-то так сделать не получилось, поэтому реализовал так:
Код:

                //Spell Blood Nova
                if (m_uiBloodNovaTimer <= uiDiff)

                {
                        Unit* mPlayers[24];        //Сюда сохраняются найденные указатели на рдд
                        uint32 uiRCount = 0;      //Счетчик кол-ва найденных рдд
                        Map* pMap = m_creature->GetMap();
                        Map::PlayerList const& pPlayers = pMap->GetPlayers();
                        if (!pPlayers.isEmpty())
                        {
                                for (Map::PlayerList::const_iterator itr = pPlayers.begin(); itr != pPlayers.end(); ++itr)
                                {
                                        Unit* pTargetBN = itr->getSource();
                                        if (pTargetBN && pTargetBN->IsInWorld())
                                        {
                                                if (m_creature->GetDistance(pTargetBN->GetPositionX(), pTargetBN->GetPositionY(), pTargetBN->GetPositionZ()) > m_fRangeDist)
                                                {
                                                        uiRCount++;
                                                        mPlayers[uiRCount-1] = itr->getSource();
                                                }
                                               
                                        }
                                }
                        }
                                if (uiRCount>0)
                                {
                                        DoCast(mPlayers[urand(0, uiRCount-1)], SPELL_BLOOD_NOVA);
                                        m_uiBloodNovaTimer = 10000;
                                }
                                else
                                {
                               
                                        DoCast(m_creature->getVictim(), SPELL_BLOOD_NOVA);
                                        m_uiBloodNovaTimer = 10000;
                                }
                }
                else
                        m_uiBloodNovaTimer -= uiDiff;


MaxXx2021 13.06.2011 14:12

Цитата:

Сообщение от Zamir (Сообщение 23347)
Смотрел код тринити, там для этого использовалась сортировка всего списка игроков по их удаленности до босса, начиная с самых дальних. Потом перебором от самых дальних находился первый игрок с дистанцией меньше положеной, кол-во игроков до этого момента сохранялось в переменной. Потом через std::advance итератор рандомно ставился между началом списка и этой переменной, так получали рандомную цель в рдд. У меня почему-то так сделать не получилось, поэтому реализовал так:
Код:

                //Spell Blood Nova
                if (m_uiBloodNovaTimer <= uiDiff)

                {
                        Unit* mPlayers[24];        //Сюда сохраняются найденные указатели на рдд
                        uint32 uiRCount = 0;      //Счетчик кол-ва найденных рдд
                        Map* pMap = m_creature->GetMap();
                        Map::PlayerList const& pPlayers = pMap->GetPlayers();
                        if (!pPlayers.isEmpty())
                        {
                                for (Map::PlayerList::const_iterator itr = pPlayers.begin(); itr != pPlayers.end(); ++itr)
                                {
                                        Unit* pTargetBN = itr->getSource();
                                        if (pTargetBN && pTargetBN->IsInWorld())
                                        {
                                                if (m_creature->GetDistance(pTargetBN->GetPositionX(), pTargetBN->GetPositionY(), pTargetBN->GetPositionZ()) > m_fRangeDist)
                                                {
                                                        uiRCount++;
                                                        mPlayers[uiRCount-1] = itr->getSource();
                                                }
                                               
                                        }
                                }
                        }
                                if (uiRCount>0)
                                {
                                        DoCast(mPlayers[urand(0, uiRCount-1)], SPELL_BLOOD_NOVA);
                                        m_uiBloodNovaTimer = 10000;
                                }
                                else
                                {
                               
                                        DoCast(m_creature->getVictim(), SPELL_BLOOD_NOVA);
                                        m_uiBloodNovaTimer = 10000;
                                }
                }
                else
                        m_uiBloodNovaTimer -= uiDiff;


не проще в ядро в FillCustomArea?

Zamir 13.06.2011 20:36

А что это такое и где? Сейчас искал по всем файлам, не нашел.
В общем, нову я сделал. Теперь застрял на blood link. Есть несколько скиллов:

- 72176, этим бафаются мобы саурфанга.
- 72202, какой-то непонятный dummy, который прокает от предыдущего.
- 72195, этот восстанавливает энергию боссу.

У меня никак не получается сделать так, чтобы при атаках мобов босс восполнял энергию. Вернее, можно сделать, чтобы босс кастовал на себя 72195 при атаках саммонов, но вроде это как-то неправильно. По мувикам с оффа от адов еще анимация идет. Читал http://ru-mangos.ru/showthread.php?t=1580 тему, просмотрел те исходники, но полезного там не нашел, мб плохо искал. Еще читал http://ru-mangos.ru/showthread.php?t=3261, но мало что там понял.

rsa 13.06.2011 21:27

Цитата:

Сообщение от Zamir (Сообщение 23355)
У меня никак не получается сделать так, чтобы при атаках мобов босс восполнял энергию.

если вы используете чистое ядро мангоса, то вам сначала придется написать код для энергии вообще, потом код для реального использования вехиклов, потом для триггерения этих самых спеллов, потом здорово покорежить проверки в spell.cpp и только потом радоваться как оно хорошо восполняется. нужного кода там просто нет, и когда он будет (и будет ли вообще) пока неизвестно.

zergtmn 13.06.2011 22:12

Тип энергии можно поменять в скрипте, а в базе прописать vehicle_id = 639 и полоска энергии будет фиолетовой. Для саурфанга нужен самый минимум от вехиклов, это 2 поля в update пакете, который работает на чистом ядре.

rsa 13.06.2011 22:25

Цитата:

Сообщение от zergtmn (Сообщение 23357)
Тип энергии можно поменять в скрипте, а в базе прописать vehicle_id = 639 и полоска энергии будет фиолетовой. Для саурфанга нужен самый минимум от вехиклов, это 2 поля в update пакете, который работает на чистом ядре.

только она будет сразу 100% и никакого восполнения увидеть не придется. триггерных тоже в чистом нет, эффекта на энергию нет, ауры на нее тоже не действуют. у меня все это тоже не совсем верно сделано (как впрочем почти всегда) но работает.

MaxXx2021 15.06.2011 12:56

Цитата:

Сообщение от Zamir (Сообщение 23355)
А что это такое и где? Сейчас искал по всем файлам, не нашел.
В общем, нову я сделал. Теперь застрял на blood link. Есть несколько скиллов:

- 72176, этим бафаются мобы саурфанга.
- 72202, какой-то непонятный dummy, который прокает от предыдущего.
- 72195, этот восстанавливает энергию боссу.

У меня никак не получается сделать так, чтобы при атаках мобов босс восполнял энергию. Вернее, можно сделать, чтобы босс кастовал на себя 72195 при атаках саммонов, но вроде это как-то неправильно. По мувикам с оффа от адов еще анимация идет. Читал http://ru-mangos.ru/showthread.php?t=1580 тему, просмотрел те исходники, но полезного там не нашел, мб плохо искал. Еще читал http://ru-mangos.ru/showthread.php?t=3261, но мало что там понял.

m_creature->setPowerType(POWER_RUNIC_POWER);
остальное надо смотреть в самих спеллах.

bool Spell::FillCustomTargetMap(SpellEffectIndex i, UnitList &targetUnitMap)
Здесь можно реализовать переборку и выбор нужных таргетов в ядре.

rsa 16.06.2011 13:25

Цитата:

Сообщение от MaxXx2021 (Сообщение 23402)
bool Spell::FillCustomTargetMap(SpellEffectIndex i, UnitList &targetUnitMap)
Здесь можно реализовать переборку и выбор нужных таргетов в ядре.

чтобы получить функцию FillCustomTargetMap ему надо форкнуть R2. а после этого вся вышеописанная возня теряет смысл, потому что там все это и так уже с год работает (хотя конечно требует серьезной корректировки).

Zamir 16.06.2011 17:05

Спасибо всем. Доделал скиллы босса, работает, похоже на оригинал) Стал скриптовать сам эвент с мурадином и оверлордом саурфангом; пока скриптую мурадина. Возникла проблема:

В определенное время мурадин бежит на саурфанга. Но кроме него у меня там стоят 5 солдат (37830). Как заставить их бежать одновременно с мурадином в определенные координаты, для каждого солдата свои? Читал код тринити, там функцией получался список указателей на всех мобов с entry 37830, и потом уже каждому давались команды. В мангосе такую функцию я реализовать не смог. Какие есть еще возможности?

MaS0n 16.06.2011 20:27

Лист гуидов, OnCreatureCreate, при ентри 37830 заносишь в лист, перебираешь в скрипте, instance->GetCreature(guid)

Можно лист паблик сделать, а если приват, пишешь метод для доступа к нему

Кстати, примеров в сд2 масса

virusav 16.06.2011 20:29

Движение в определенные координаты:
Код:

m_creature->GetMotionMaster()->MovePoint(0, pTrap->GetPositionX(), pTrap->GetPositionY(), pTrap->GetPositionZ());

Zamir 17.06.2011 01:37

Спасибо. Почти все доделал. Мурадин с 5 солдатами бегут к саурфангу, он кастует grip of agony 70572 и поднимает их в воздух. Одна проблема - этот спелл 70572 срабатывает не только на нпц, но и на игроков. Просмотрел в спеллворке, но так и не понял его механику. В гугле единственное, что нашел, это упоминание этого скилла в trinity, в таблице conditions. Там этот скилл был как-то привязан к нпц 37920, 37200, 37187 и 37830. Но я не знаю, для чего эта таблица.
В общем, вопрос: как или где нужно покопаться, чтобы скилл 70572 не использовался на игроков?

virusav 17.06.2011 08:57

У спелла 70572 один эффект SPELL_AURA_DUMMY, поэтому в SpellAuras.cpp в void Aura::HandleAuraDummy(bool apply, bool Real) можно добавить обработку для данного спелла, в самом начале которой написать:
Код:

if (target->GetTypeId() != TYPEID_UNIT)
return;

В этом случае спелл будет кастоваться только на нпц.

MaxXx2021 17.06.2011 13:58

Цитата:

Сообщение от virusav (Сообщение 23467)
У спелла 70572 один эффект SPELL_AURA_DUMMY, поэтому в SpellAuras.cpp в void Aura::HandleAuraDummy(bool apply, bool Real) можно добавить обработку для данного спелла, в самом начале которой написать:
Код:

if (target->GetTypeId() != TYPEID_UNIT)
return;

В этом случае спелл будет кастоваться только на нпц.

Имхо извращение.
Targets (22, 7) (TARGET_CASTER_COORDINATES, TARGET_AREAEFFECT_INSTANT) в spell_script_target таблицу добавить нужные ентри и все.

Цитата:

Сообщение от Zamir (Сообщение 23462)
Мурадин с 5 солдатами бегут к саурфангу

П.С. мурадин только для альянса, для орды там саурфанг. и диалоги совсем другие.

virusav 17.06.2011 15:54

Ответ был на вопрос:
Цитата:

В общем, вопрос: как или где нужно покопаться, чтобы скилл 70572 не использовался на игроков?

MaxXx2021 17.06.2011 18:32

Цитата:

Сообщение от virusav (Сообщение 23475)
Ответ был на вопрос:

и? Просто впишите в таблицу ентри всех мобов на которых должно кастоватся. игроки отпадают автоматом.

Zamir 18.06.2011 01:35

Благодарю.
Из-за отсутствия у меня вехиклов придется что-то придумать с трупом саурфанга. Да и появляющийся корабль пока не знаю, как реализовать, поэтому пока саурфанг-старший будет появляться без корабля.
Так вот, я внимательно осматривал видео эвента, хотя их и не много. Например, вот. Появились вопросы по этому видео:

- на 1:30 синий портал, король и джайна появляются с анимацией какого-то спелла. Может знает кто, что это за спелл? Так же они с ним уходят в конце.
- примерно на 3:55 у портала, который портует по этажам, появляются какие-то две штуковины с анимацией, что это такое?
- в самом конце набежали работники. Это они должны построить палатки и заспавнить торговцев?


Ах да, и еще: я создал портал, из которого вылазят король с джайной. Но никак не пойму, как сделать его невидимым. Вернее, понимаю, что нужно поработать с phasemask, но никак не разберусь с механикой этих фаз. Читал тут http://wiki.ytdb.ru/index.php/Gameobject#phaseMask, но что-то до меня туго доходит. Впрочем, наверное сам научусь.

virusav 18.06.2011 09:36

phaseMask - это несколько другое.
Если сделать spawntimesecs отрицательным, то го не будет виден, но к нему можно будет обратиться скриптом.

MaxXx2021 18.06.2011 14:07

Цитата:

Сообщение от Zamir (Сообщение 23487)
Благодарю.
Из-за отсутствия у меня вехиклов придется что-то придумать с трупом саурфанга. Да и появляющийся корабль пока не знаю, как реализовать, поэтому пока саурфанг-старший будет появляться без корабля.
Так вот, я внимательно осматривал видео эвента, хотя их и не много. Например, вот. Появились вопросы по этому видео:

- на 1:30 синий портал, король и джайна появляются с анимацией какого-то спелла. Может знает кто, что это за спелл? Так же они с ним уходят в конце.
- примерно на 3:55 у портала, который портует по этажам, появляются какие-то две штуковины с анимацией, что это такое?
- в самом конце набежали работники. Это они должны построить палатки и заспавнить торговцев?


Ах да, и еще: я создал портал, из которого вылазят король с джайной. Но никак не пойму, как сделать его невидимым. Вернее, понимаю, что нужно поработать с phasemask, но никак не разберусь с механикой этих фаз. Читал тут http://wiki.ytdb.ru/index.php/Gameobject#phaseMask, но что-то до меня туго доходит. Впрочем, наверное сам научусь.

Немного вам на будущее, на оффе в этом инсте нет фазирования, как и в других.

Zamir 19.06.2011 01:04

Учту. Синий портал сделал, понял, как с этим работать через spawntimesecs.

Zamir 23.06.2011 15:18

Почти все готово, остался только прилетающий дирижабль.
Пытаюсь в коде создать транспорт, но не получается.

Код:

Transport* t = new Transport();
Пишутся ошибки, и я никак не могу понять, что же я сделал не так.

1>boss_deathbringer_saurfang.obj : error LNK2019: ссылка на неразрешенный внешний символ "public: __thiscall Transport::Transport(void)" (??0Transport@@QAE@XZ) в функции "void __cdecl t_test(void)" (?t_test@@YAXXZ)
1>boss_deathbringer_saurfang.obj : error LNK2001: неразрешенный внешний символ ""class SQLStorage sGOStorage" (?sGOStorage@@3VSQLStorage@@A)"
1>..\..\..\..\bin\win32_release/mangosscript.dll : fatal error LNK1120: 2 неразрешенных внешних элементов

Sid 23.06.2011 16:05

сделай класс Transport экспортируемым, только это вообще неправильный ход.

Zamir 23.06.2011 18:01

Почитал повнимательнее, в ядре нашел

Код:

        const MapEntry* pMapInfo = sMapStore.LookupEntry(mapid);
        if(!pMapInfo || pMapInfo->Instanceable())
        {
            delete t;
            continue;
        }

То есть сейчас поддержки транспортов в инстах нет?

evilstar 25.06.2011 17:17

Ситуация с Кораблем в ЦЛК и чтобы НПЦ по нему ходил - это вам надо в тему http://ru-mangos.ru/showpost.php?p=23618&postcount=1

Zamir 02.07.2011 14:20

Спасибо, эту тему я читал. Но я не мог вообще создать пустой транспорт в цлк.
Теперь у меня другая проблема: разбираюсь с контролем леди, хочу сделать так, чтобы игроки в контроле юзали какие-то скиллы против рейда. В общем-то работает, но возникла проблема: игрок в контроле видит остальной рейд как врагов с красненькими фреймами, но рейд этого игрока не видит врагом, хотя можно его зацепить аоешкой. Что не так? Я уже и вручную ставил игроку в контроле фракцию 21, не помогает.

rsa 02.07.2011 21:58

вы опоздали примерно на год, дискуссии по этим спеллам активно шли тут, на YTDB и в других местах в апреле-мае прошлого года. повторяться скучновато...

MaxXx2021 04.07.2011 18:56

Цитата:

Сообщение от Zamir (Сообщение 23824)
Спасибо, эту тему я читал. Но я не мог вообще создать пустой транспорт в цлк.
Теперь у меня другая проблема: разбираюсь с контролем леди, хочу сделать так, чтобы игроки в контроле юзали какие-то скиллы против рейда. В общем-то работает, но возникла проблема: игрок в контроле видит остальной рейд как врагов с красненькими фреймами, но рейд этого игрока не видит врагом, хотя можно его зацепить аоешкой. Что не так? Я уже и вручную ставил игроку в контроле фракцию 21, не помогает.

Код:

    if (newShipA = instance->LoadTransportInMap(m_uiTeamInInstance == ALLIANCE ? GO_SKYBREAKER_ALLIANCE : GO_HAMMER_HORDE, 0, 80000, true, 6.23f))
        m_mGoEntryGuidStore[newShipA->GetEntry()] = newShipA->GetObjectGuid();

    //instance->LoadTransportInMap(m_uiTeamInInstance == ALLIANCE ? GO_HAMMER_ALLIANCE : GO_SKYBREAKER_HORDE, 0, 60000, true); //for test
}

А так не пробовали? У меня скайбрекер и оргрим хаммер в инсты норм загрузились.


Текущее время: 01:01. Часовой пояс GMT +3.

ru-mangos.ru - Русское сообщество MaNGOS