Ru-MaNGOS

Вернуться   Ru-MaNGOS > Документация > Новичкам

Важная информация

Новичкам Информация для всех новичков, новичкам рекомендуется задавать свои вопросы здесь

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
Старый 10.06.2011, 10:22   #1
Zamir
Гость
 
Сообщений: n/a
По умолчанию

Здравствуйте. Я совсем еще новичек, недавно скачал чистые исходники и начал копаться в коде. Нашел в сд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 не хочет никак.
  Ответить с цитированием
Старый 10.06.2011, 15:14   #2
rsa
Почетный флудер
Старожил
 
Аватар для rsa
 
Регистрация: 08.03.2010
Адрес: Мурманск, Россия
Сообщений: 788
Сказал(а) спасибо: 55
Поблагодарили 333 раз(а) в 151 сообщениях
Записей в дневнике: 1
rsa Как самоцвет среди гранитаrsa Как самоцвет среди гранитаrsa Как самоцвет среди гранитаrsa Как самоцвет среди гранита
По умолчанию

Пожалуйста, почитайте мануалы или хотя бы сырцы с которыми вы пытаетесь извращаться. вы пробуете
DoCastSpellIfCan(m_creature->getVictim(),
а у спелла -
SpellRange: (Id 1) "Self Only":
в итоге будете всегда получать облом.
rsa вне форума   Ответить с цитированием
Старый 10.06.2011, 16:21   #3
Zamir
Гость
 
Сообщений: n/a
По умолчанию

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

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

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

Последний раз редактировалось Zamir; 10.06.2011 в 16:39.
  Ответить с цитированием
Старый 10.06.2011, 19:21   #4
Lordronn
Умный
 
Регистрация: 17.06.2010
Сообщений: 397
Сказал(а) спасибо: 58
Поблагодарили 55 раз(а) в 38 сообщениях
Lordronn Скоро придёт к известности
По умолчанию

Спелл идет селфкастом, т.е автоматом кастится на кастера. При касте можешь указывать что хочешь, проблему это не решит. Нужен другой spellId, либо же хакать этот(ставить таргетИД другой), но вряд ли это поможет, на оффе наверное этот спелл триггерит что-то другое
Lordronn вне форума   Ответить с цитированием
Старый 11.06.2011, 19:33   #5
MaxXx2021
Ученый
 
Аватар для MaxXx2021
 
Регистрация: 09.03.2010
Адрес: Кыргызстан
Сообщений: 266
Сказал(а) спасибо: 41
Поблагодарили 115 раз(а) в 34 сообщениях
MaxXx2021 Скоро придёт к известности
По умолчанию

Дело тут не в таргете, Спелл кастуется игроком, но нет визуального эффекта дыхания. Если же боссом не кастуется попробуй ввести каст вот так "m_creature->CastSpell(m_creature, SPELL_BREATH, false); ! Встречал некоторые спеллы котороые не кастуются при DoCastSpellIfCan или DoCast.
MaxXx2021 вне форума   Ответить с цитированием
Старый 11.06.2011, 22:26   #6
Zamir
Гость
 
Сообщений: n/a
По умолчанию

Хм, спасибо всем.
У меня возник другой вопрос. Писал скрипт для саурфанга, застрял на спелле 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 в 02:31.
  Ответить с цитированием
Старый 12.06.2011, 13:30   #7
Zamir
Гость
 
Сообщений: n/a
По умолчанию

Пришлось изменять запись в spell.dbc, так как я не знаю, как реализовать этот спелл на чистых исходниках.
  Ответить с цитированием
Старый 12.06.2011, 18:15   #8
Lordronn
Умный
 
Регистрация: 17.06.2010
Сообщений: 397
Сказал(а) спасибо: 58
Поблагодарили 55 раз(а) в 38 сообщениях
Lordronn Скоро придёт к известности
По умолчанию

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
Lordronn вне форума   Ответить с цитированием
Старый 12.06.2011, 21:51   #9
Zamir
Гость
 
Сообщений: n/a
По умолчанию

У меня почему-то нет некоторых функций, например той же SelectTarget. Скачивал исходники с https://github.com/mangos/mangos.
  Ответить с цитированием
Старый 12.06.2011, 22:32   #10
Lordronn
Умный
 
Регистрация: 17.06.2010
Сообщений: 397
Сказал(а) спасибо: 58
Поблагодарили 55 раз(а) в 38 сообщениях
Lordronn Скоро придёт к известности
По умолчанию

Цитата:
Сообщение от Zamir Посмотреть сообщение
У меня почему-то нет некоторых функций, например той же SelectTarget. Скачивал исходники с https://github.com/mangos/mangos.
Цитата:
то вот мой код саурфанга на ТС
я же написал, что я писал это для ядра тринити
Lordronn вне форума   Ответить с цитированием
Старый 13.06.2011, 00:04   #11
Zamir
Гость
 
Сообщений: n/a
По умолчанию

А, да. Ладно, функции вроде 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;

Последний раз редактировалось Zamir; 13.06.2011 в 00:08.
  Ответить с цитированием
Старый 13.06.2011, 00:09   #12
Lordronn
Умный
 
Регистрация: 17.06.2010
Сообщений: 397
Сказал(а) спасибо: 58
Поблагодарили 55 раз(а) в 38 сообщениях
Lordronn Скоро придёт к известности
По умолчанию

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

Код:
                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;
Lordronn вне форума   Ответить с цитированием
Старый 13.06.2011, 00:14   #13
Zamir
Гость
 
Сообщений: n/a
По умолчанию

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

Последний раз редактировалось Zamir; 13.06.2011 в 00:19.
  Ответить с цитированием
Старый 13.06.2011, 07:57   #14
Zamir
Гость
 
Сообщений: n/a
По умолчанию

Смотрел код тринити, там для этого использовалась сортировка всего списка игроков по их удаленности до босса, начиная с самых дальних. Потом перебором от самых дальних находился первый игрок с дистанцией меньше положеной, кол-во игроков до этого момента сохранялось в переменной. Потом через 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;
  Ответить с цитированием
Старый 13.06.2011, 14:12   #15
MaxXx2021
Ученый
 
Аватар для MaxXx2021
 
Регистрация: 09.03.2010
Адрес: Кыргызстан
Сообщений: 266
Сказал(а) спасибо: 41
Поблагодарили 115 раз(а) в 34 сообщениях
MaxXx2021 Скоро придёт к известности
По умолчанию

Цитата:
Сообщение от Zamir Посмотреть сообщение
Смотрел код тринити, там для этого использовалась сортировка всего списка игроков по их удаленности до босса, начиная с самых дальних. Потом перебором от самых дальних находился первый игрок с дистанцией меньше положеной, кол-во игроков до этого момента сохранялось в переменной. Потом через 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?
MaxXx2021 вне форума   Ответить с цитированием
Старый 13.06.2011, 20:36   #16
Zamir
Гость
 
Сообщений: n/a
По умолчанию

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

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

У меня никак не получается сделать так, чтобы при атаках мобов босс восполнял энергию. Вернее, можно сделать, чтобы босс кастовал на себя 72195 при атаках саммонов, но вроде это как-то неправильно. По мувикам с оффа от адов еще анимация идет. Читал http://ru-mangos.ru/showthread.php?t=1580 тему, просмотрел те исходники, но полезного там не нашел, мб плохо искал. Еще читал http://ru-mangos.ru/showthread.php?t=3261, но мало что там понял.
  Ответить с цитированием
Старый 13.06.2011, 21:27   #17
rsa
Почетный флудер
Старожил
 
Аватар для rsa
 
Регистрация: 08.03.2010
Адрес: Мурманск, Россия
Сообщений: 788
Сказал(а) спасибо: 55
Поблагодарили 333 раз(а) в 151 сообщениях
Записей в дневнике: 1
rsa Как самоцвет среди гранитаrsa Как самоцвет среди гранитаrsa Как самоцвет среди гранитаrsa Как самоцвет среди гранита
По умолчанию

Цитата:
Сообщение от Zamir Посмотреть сообщение
У меня никак не получается сделать так, чтобы при атаках мобов босс восполнял энергию.
если вы используете чистое ядро мангоса, то вам сначала придется написать код для энергии вообще, потом код для реального использования вехиклов, потом для триггерения этих самых спеллов, потом здорово покорежить проверки в spell.cpp и только потом радоваться как оно хорошо восполняется. нужного кода там просто нет, и когда он будет (и будет ли вообще) пока неизвестно.
rsa вне форума   Ответить с цитированием
Старый 13.06.2011, 22:12   #18
zergtmn
MaNGOS Dev
 
Аватар для zergtmn
 
Регистрация: 07.03.2010
Сообщений: 314
Сказал(а) спасибо: 30
Поблагодарили 153 раз(а) в 83 сообщениях
zergtmn Обладатель прекрасной аурыzergtmn Обладатель прекрасной ауры
По умолчанию

Тип энергии можно поменять в скрипте, а в базе прописать vehicle_id = 639 и полоска энергии будет фиолетовой. Для саурфанга нужен самый минимум от вехиклов, это 2 поля в update пакете, который работает на чистом ядре.
zergtmn вне форума   Ответить с цитированием
Старый 13.06.2011, 22:25   #19
rsa
Почетный флудер
Старожил
 
Аватар для rsa
 
Регистрация: 08.03.2010
Адрес: Мурманск, Россия
Сообщений: 788
Сказал(а) спасибо: 55
Поблагодарили 333 раз(а) в 151 сообщениях
Записей в дневнике: 1
rsa Как самоцвет среди гранитаrsa Как самоцвет среди гранитаrsa Как самоцвет среди гранитаrsa Как самоцвет среди гранита
По умолчанию

Цитата:
Сообщение от zergtmn Посмотреть сообщение
Тип энергии можно поменять в скрипте, а в базе прописать vehicle_id = 639 и полоска энергии будет фиолетовой. Для саурфанга нужен самый минимум от вехиклов, это 2 поля в update пакете, который работает на чистом ядре.
только она будет сразу 100% и никакого восполнения увидеть не придется. триггерных тоже в чистом нет, эффекта на энергию нет, ауры на нее тоже не действуют. у меня все это тоже не совсем верно сделано (как впрочем почти всегда) но работает.
rsa вне форума   Ответить с цитированием
Старый 15.06.2011, 12:56   #20
MaxXx2021
Ученый
 
Аватар для MaxXx2021
 
Регистрация: 09.03.2010
Адрес: Кыргызстан
Сообщений: 266
Сказал(а) спасибо: 41
Поблагодарили 115 раз(а) в 34 сообщениях
MaxXx2021 Скоро придёт к известности
По умолчанию

Цитата:
Сообщение от Zamir Посмотреть сообщение
А что это такое и где? Сейчас искал по всем файлам, не нашел.
В общем, нову я сделал. Теперь застрял на 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)
Здесь можно реализовать переборку и выбор нужных таргетов в ядре.
MaxXx2021 вне форума   Ответить с цитированием
Старый 16.06.2011, 13:25   #21
rsa
Почетный флудер
Старожил
 
Аватар для rsa
 
Регистрация: 08.03.2010
Адрес: Мурманск, Россия
Сообщений: 788
Сказал(а) спасибо: 55
Поблагодарили 333 раз(а) в 151 сообщениях
Записей в дневнике: 1
rsa Как самоцвет среди гранитаrsa Как самоцвет среди гранитаrsa Как самоцвет среди гранитаrsa Как самоцвет среди гранита
По умолчанию

Цитата:
Сообщение от MaxXx2021 Посмотреть сообщение
bool Spell::FillCustomTargetMap(SpellEffectIndex i, UnitList &targetUnitMap)
Здесь можно реализовать переборку и выбор нужных таргетов в ядре.
чтобы получить функцию FillCustomTargetMap ему надо форкнуть R2. а после этого вся вышеописанная возня теряет смысл, потому что там все это и так уже с год работает (хотя конечно требует серьезной корректировки).
rsa вне форума   Ответить с цитированием
Старый 16.06.2011, 17:05   #22
Zamir
Гость
 
Сообщений: n/a
По умолчанию

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

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

Последний раз редактировалось Zamir; 16.06.2011 в 17:08.
  Ответить с цитированием
Старый 16.06.2011, 20:27   #23
MaS0n
Модератор
 
Регистрация: 09.03.2010
Адрес: dev/null
Сообщений: 126
Сказал(а) спасибо: 44
Поблагодарили 111 раз(а) в 47 сообщениях
MaS0n Скоро придёт к известностиMaS0n Скоро придёт к известности
Отправить сообщение для MaS0n с помощью ICQ
По умолчанию

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

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

Кстати, примеров в сд2 масса
MaS0n вне форума   Ответить с цитированием
Старый 16.06.2011, 20:29   #24
virusav
Администратор
 
Аватар для virusav
 
Регистрация: 19.02.2010
Сообщений: 492
Сказал(а) спасибо: 55
Поблагодарили 341 раз(а) в 154 сообщениях
virusav Реально хороший человекvirusav Реально хороший человекvirusav Реально хороший человекvirusav Реально хороший человек
Отправить сообщение для virusav с помощью ICQ
По умолчанию

Движение в определенные координаты:
Код:
m_creature->GetMotionMaster()->MovePoint(0, pTrap->GetPositionX(), pTrap->GetPositionY(), pTrap->GetPositionZ());
virusav вне форума   Ответить с цитированием
Старый 17.06.2011, 01:37   #25
Zamir
Гость
 
Сообщений: n/a
По умолчанию

Спасибо. Почти все доделал. Мурадин с 5 солдатами бегут к саурфангу, он кастует grip of agony 70572 и поднимает их в воздух. Одна проблема - этот спелл 70572 срабатывает не только на нпц, но и на игроков. Просмотрел в спеллворке, но так и не понял его механику. В гугле единственное, что нашел, это упоминание этого скилла в trinity, в таблице conditions. Там этот скилл был как-то привязан к нпц 37920, 37200, 37187 и 37830. Но я не знаю, для чего эта таблица.
В общем, вопрос: как или где нужно покопаться, чтобы скилл 70572 не использовался на игроков?
  Ответить с цитированием
Старый 17.06.2011, 08:57   #26
virusav
Администратор
 
Аватар для virusav
 
Регистрация: 19.02.2010
Сообщений: 492
Сказал(а) спасибо: 55
Поблагодарили 341 раз(а) в 154 сообщениях
virusav Реально хороший человекvirusav Реально хороший человекvirusav Реально хороший человекvirusav Реально хороший человек
Отправить сообщение для virusav с помощью ICQ
По умолчанию

У спелла 70572 один эффект SPELL_AURA_DUMMY, поэтому в SpellAuras.cpp в void Aura::HandleAuraDummy(bool apply, bool Real) можно добавить обработку для данного спелла, в самом начале которой написать:
Код:
if (target->GetTypeId() != TYPEID_UNIT)
return;
В этом случае спелл будет кастоваться только на нпц.
virusav вне форума   Ответить с цитированием
Старый 17.06.2011, 13:58   #27
MaxXx2021
Ученый
 
Аватар для MaxXx2021
 
Регистрация: 09.03.2010
Адрес: Кыргызстан
Сообщений: 266
Сказал(а) спасибо: 41
Поблагодарили 115 раз(а) в 34 сообщениях
MaxXx2021 Скоро придёт к известности
По умолчанию

Цитата:
Сообщение от virusav Посмотреть сообщение
У спелла 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 Посмотреть сообщение
Мурадин с 5 солдатами бегут к саурфангу
П.С. мурадин только для альянса, для орды там саурфанг. и диалоги совсем другие.
MaxXx2021 вне форума   Ответить с цитированием
Старый 17.06.2011, 15:54   #28
virusav
Администратор
 
Аватар для virusav
 
Регистрация: 19.02.2010
Сообщений: 492
Сказал(а) спасибо: 55
Поблагодарили 341 раз(а) в 154 сообщениях
virusav Реально хороший человекvirusav Реально хороший человекvirusav Реально хороший человекvirusav Реально хороший человек
Отправить сообщение для virusav с помощью ICQ
По умолчанию

Ответ был на вопрос:
Цитата:
В общем, вопрос: как или где нужно покопаться, чтобы скилл 70572 не использовался на игроков?
virusav вне форума   Ответить с цитированием
Старый 17.06.2011, 18:32   #29
MaxXx2021
Ученый
 
Аватар для MaxXx2021
 
Регистрация: 09.03.2010
Адрес: Кыргызстан
Сообщений: 266
Сказал(а) спасибо: 41
Поблагодарили 115 раз(а) в 34 сообщениях
MaxXx2021 Скоро придёт к известности
По умолчанию

Цитата:
Сообщение от virusav Посмотреть сообщение
Ответ был на вопрос:
и? Просто впишите в таблицу ентри всех мобов на которых должно кастоватся. игроки отпадают автоматом.
MaxXx2021 вне форума   Ответить с цитированием
Старый 18.06.2011, 01:35   #30
Zamir
Гость
 
Сообщений: n/a
По умолчанию

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

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


Ах да, и еще: я создал портал, из которого вылазят король с джайной. Но никак не пойму, как сделать его невидимым. Вернее, понимаю, что нужно поработать с phasemask, но никак не разберусь с механикой этих фаз. Читал тут http://wiki.ytdb.ru/index.php/Gameobject#phaseMask, но что-то до меня туго доходит. Впрочем, наверное сам научусь.
  Ответить с цитированием
Старый 18.06.2011, 09:36   #31
virusav
Администратор
 
Аватар для virusav
 
Регистрация: 19.02.2010
Сообщений: 492
Сказал(а) спасибо: 55
Поблагодарили 341 раз(а) в 154 сообщениях
virusav Реально хороший человекvirusav Реально хороший человекvirusav Реально хороший человекvirusav Реально хороший человек
Отправить сообщение для virusav с помощью ICQ
По умолчанию

phaseMask - это несколько другое.
Если сделать spawntimesecs отрицательным, то го не будет виден, но к нему можно будет обратиться скриптом.
virusav вне форума   Ответить с цитированием
Старый 18.06.2011, 14:07   #32
MaxXx2021
Ученый
 
Аватар для MaxXx2021
 
Регистрация: 09.03.2010
Адрес: Кыргызстан
Сообщений: 266
Сказал(а) спасибо: 41
Поблагодарили 115 раз(а) в 34 сообщениях
MaxXx2021 Скоро придёт к известности
По умолчанию

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

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


Ах да, и еще: я создал портал, из которого вылазят король с джайной. Но никак не пойму, как сделать его невидимым. Вернее, понимаю, что нужно поработать с phasemask, но никак не разберусь с механикой этих фаз. Читал тут http://wiki.ytdb.ru/index.php/Gameobject#phaseMask, но что-то до меня туго доходит. Впрочем, наверное сам научусь.
Немного вам на будущее, на оффе в этом инсте нет фазирования, как и в других.
MaxXx2021 вне форума   Ответить с цитированием
Старый 19.06.2011, 01:04   #33
Zamir
Гость
 
Сообщений: n/a
По умолчанию

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

Последний раз редактировалось Zamir; 19.06.2011 в 15:29.
  Ответить с цитированием
Старый 23.06.2011, 15:18   #34
Zamir
Гость
 
Сообщений: n/a
По умолчанию

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

Код:
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 неразрешенных внешних элементов
  Ответить с цитированием
Старый 23.06.2011, 16:05   #35
Sid
Ученый
 
Аватар для Sid
 
Регистрация: 02.04.2010
Сообщений: 237
Сказал(а) спасибо: 41
Поблагодарили 99 раз(а) в 44 сообщениях
Sid Скоро придёт к известностиSid Скоро придёт к известности
По умолчанию

сделай класс Transport экспортируемым, только это вообще неправильный ход.
__________________
SpellWork Qt4
Sid вне форума   Ответить с цитированием
Старый 23.06.2011, 18:01   #36
Zamir
Гость
 
Сообщений: n/a
По умолчанию

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

Код:
        const MapEntry* pMapInfo = sMapStore.LookupEntry(mapid);
        if(!pMapInfo || pMapInfo->Instanceable())
        {
            delete t;
            continue;
        }
То есть сейчас поддержки транспортов в инстах нет?
  Ответить с цитированием
Старый 25.06.2011, 17:17   #37
evilstar
Супер-модератор
 
Аватар для evilstar
 
Регистрация: 07.04.2010
Адрес: Москва
Сообщений: 221
Сказал(а) спасибо: 101
Поблагодарили 27 раз(а) в 17 сообщениях
evilstar Скоро придёт к известностиevilstar Скоро придёт к известности
Отправить сообщение для evilstar с помощью ICQ
По умолчанию

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

Теперь и в Бете Warlords of Draenor & HotS !
evilstar вне форума   Ответить с цитированием
Старый 02.07.2011, 14:20   #38
Zamir
Гость
 
Сообщений: n/a
По умолчанию

Спасибо, эту тему я читал. Но я не мог вообще создать пустой транспорт в цлк.
Теперь у меня другая проблема: разбираюсь с контролем леди, хочу сделать так, чтобы игроки в контроле юзали какие-то скиллы против рейда. В общем-то работает, но возникла проблема: игрок в контроле видит остальной рейд как врагов с красненькими фреймами, но рейд этого игрока не видит врагом, хотя можно его зацепить аоешкой. Что не так? Я уже и вручную ставил игроку в контроле фракцию 21, не помогает.
  Ответить с цитированием
Старый 02.07.2011, 21:58   #39
rsa
Почетный флудер
Старожил
 
Аватар для rsa
 
Регистрация: 08.03.2010
Адрес: Мурманск, Россия
Сообщений: 788
Сказал(а) спасибо: 55
Поблагодарили 333 раз(а) в 151 сообщениях
Записей в дневнике: 1
rsa Как самоцвет среди гранитаrsa Как самоцвет среди гранитаrsa Как самоцвет среди гранитаrsa Как самоцвет среди гранита
По умолчанию

вы опоздали примерно на год, дискуссии по этим спеллам активно шли тут, на YTDB и в других местах в апреле-мае прошлого года. повторяться скучновато...
rsa вне форума   Ответить с цитированием
Старый 04.07.2011, 18:56   #40
MaxXx2021
Ученый
 
Аватар для MaxXx2021
 
Регистрация: 09.03.2010
Адрес: Кыргызстан
Сообщений: 266
Сказал(а) спасибо: 41
Поблагодарили 115 раз(а) в 34 сообщениях
MaxXx2021 Скоро придёт к известности
По умолчанию

Цитата:
Сообщение от Zamir Посмотреть сообщение
Спасибо, эту тему я читал. Но я не мог вообще создать пустой транспорт в цлк.
Теперь у меня другая проблема: разбираюсь с контролем леди, хочу сделать так, чтобы игроки в контроле юзали какие-то скиллы против рейда. В общем-то работает, но возникла проблема: игрок в контроле видит остальной рейд как врагов с красненькими фреймами, но рейд этого игрока не видит врагом, хотя можно его зацепить аоешкой. Что не так? Я уже и вручную ставил игроку в контроле фракцию 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
}
А так не пробовали? У меня скайбрекер и оргрим хаммер в инсты норм загрузились.

Последний раз редактировалось MaxXx2021; 04.07.2011 в 18:58.
MaxXx2021 вне форума   Ответить с цитированием
Ответ


Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Проблема с инетом Йоха Флудильня 30 25.05.2011 16:36
Проблема чата Onfus Баг-репорты 6 08.12.2010 16:34
Проблема с обновлениями snowlynx Корзина 0 04.08.2010 21:55
Проблема с авторизацией snowlynx Корзина 4 02.08.2010 12:41


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


ru-mangos.ru - Русское сообщество MaNGOS
Главная цель проекта MaNGOS - обучающая, поэтому разрешается использовать исходный код и собранную программу только для образовательных целей.
Вы не можете использовать MaNGOS в коммерческих целях, а также не разрешается устанавливать публичные серверы на базе MaNGOS.
Любое копирование материалов, информации в любом виде без указания источника - форума Ru-MaNGOS будет считаться нарушением авторских прав и нарушением Уголовного Кодекса РФ, ст. 146 ст. 147.
Перевод vBulletin: zCarot