Ru-MaNGOS

Вернуться   Ru-MaNGOS > Документация > Языки программирования

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

Языки программирования Изучаем С++, Sql, php, Lua, Python

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
Старый 28.04.2010, 17:07   #41
KiriX
Умный
Старожил
 
Аватар для KiriX
 
Регистрация: 06.03.2010
Сообщений: 886
Сказал(а) спасибо: 698
Поблагодарили 433 раз(а) в 181 сообщениях
Записей в дневнике: 4
KiriX Реально хороший человекKiriX Реально хороший человекKiriX Реально хороший человекKiriX Реально хороший человекKiriX Реально хороший человек
По умолчанию

Пара спеллов:
http://ru.wowhead.com/spell=38736
http://ru.wowhead.com/spell=57853

Проблема в следующем - при юзе итема, на котором они висят, они кастуются, но триггера спелла, висящего на них, не происходит. Не могу понять куда копать... Есть идеи?

Ясно... Спелл имеет TARGET_SCRIPT. Значит эффект вешается на цель, указанную в базе и уже эта цель триггерит спелл. А нам надо триггерить спелл от кастера...
KiriX вне форума   Ответить с цитированием
Старый 29.04.2010, 09:31   #42
MaS0n
Модератор
 
Регистрация: 09.03.2010
Адрес: dev/null
Сообщений: 126
Сказал(а) спасибо: 44
Поблагодарили 111 раз(а) в 47 сообщениях
MaS0n Скоро придёт к известностиMaS0n Скоро придёт к известности
Отправить сообщение для MaS0n с помощью ICQ
По умолчанию

SpellAuras.cpp
Есть такая функция, которая вызывается при каждом тике триггерных аур
Код:
void Aura::TriggerSpell()
Ищем место где в коде будет
Код:
    else
    {
        // Spell exist but require custom code
        switch(auraId)
        {
И здесь на нужное место вставляем тот же самый каст спелла, но уже на кастера, что-то вроде
Код:
            case 38736:
            {
                if (Unit * caster = GetCaster())
                    caster->CastSpell(caster, trigger_spell_id, true, NULL, this, casterGUID);
                return;
            }
MaS0n вне форума   Ответить с цитированием
3 пользователя(ей) сказали cпасибо:
Gerald (15.05.2011), Hantet (06.05.2010), KiriX (29.04.2010)
Старый 29.04.2010, 12:03   #43
KiriX
Умный
Старожил
 
Аватар для KiriX
 
Регистрация: 06.03.2010
Сообщений: 886
Сказал(а) спасибо: 698
Поблагодарили 433 раз(а) в 181 сообщениях
Записей в дневнике: 4
KiriX Реально хороший человекKiriX Реально хороший человекKiriX Реально хороший человекKiriX Реально хороший человекKiriX Реально хороший человек
По умолчанию

Спасибо, как раз не мог найти этот обработчик
Но судя по данным ДБЦ спелла, создаётся впечатление, что надо в таблицу spell_script_target есть смысл добавить новый тип цели - self... Или же подобные спеллы просто добавлять в исключение в код - примут ли?
KiriX вне форума   Ответить с цитированием
Старый 29.04.2010, 12:32   #44
MaS0n
Модератор
 
Регистрация: 09.03.2010
Адрес: dev/null
Сообщений: 126
Сказал(а) спасибо: 44
Поблагодарили 111 раз(а) в 47 сообщениях
MaS0n Скоро придёт к известностиMaS0n Скоро придёт к известности
Отправить сообщение для MaS0n с помощью ICQ
По умолчанию

Это ответвление и было специально создано для таких случаев, перевод коммента
'триггер спелла есть, но требуется другой код'

В триггерном эффекте стоит квест-комплит с таргет-селф, я думаю, что этот эффект точно должен применятся на кастера-игрока

И если просмотреть все эти исключения, некоторые один в один повторяют основную обработку каста в самом конце как бы они уже не нужны, но стоят
MaS0n вне форума   Ответить с цитированием
Пользователь сказал cпасибо:
KiriX (29.04.2010)
Старый 29.04.2010, 13:40   #45
KiriX
Умный
Старожил
 
Аватар для KiriX
 
Регистрация: 06.03.2010
Сообщений: 886
Сказал(а) спасибо: 698
Поблагодарили 433 раз(а) в 181 сообщениях
Записей в дневнике: 4
KiriX Реально хороший человекKiriX Реально хороший человекKiriX Реально хороший человекKiriX Реально хороший человекKiriX Реально хороший человек
По умолчанию

Цитата:
Сообщение от MaS0n Посмотреть сообщение
Это ответвление и было специально создано для таких случаев, перевод коммента
'триггер спелла есть, но требуется другой код'

В триггерном эффекте стоит квест-комплит с таргет-селф, я думаю, что этот эффект точно должен применятся на кастера-игрока

*И если просмотреть все эти исключения, некоторые один в один повторяют основную обработку каста в самом конце как бы они уже не нужны, но стоят
Я сообщение твоё получил на работе - коммент не читал вообще. Спасибо за комментарий.
Вот только последнего (под звёздочкой) я не очень понял смысл... Таких спеллов несколько минимум, которые используют TARGET_SCRIPT, но по логике триггерного спелла должны кастоваться от кастера. Есть ли смысл добавлять тип цели спелла - кастер?
KiriX вне форума   Ответить с цитированием
Старый 03.05.2010, 09:39   #46
zergtmn
MaNGOS Dev
 
Аватар для zergtmn
 
Регистрация: 07.03.2010
Сообщений: 314
Сказал(а) спасибо: 30
Поблагодарили 153 раз(а) в 83 сообщениях
zergtmn Обладатель прекрасной аурыzergtmn Обладатель прекрасной ауры
По умолчанию

Пытаюсь сделать, чтобы моб в момент смерти кастовал АоЕ спелл, например http://ru.wowhead.com/spell=62598 (с помощью EAI или SD2, не важно). Анимация есть, но спелл промахивается в 100% случаев (кастуется как triggered). В чем дело? (:
Ревизия 9808.
zergtmn вне форума   Ответить с цитированием
Старый 03.05.2010, 20:25   #47
LordJZ
Супер-модератор
 
Аватар для LordJZ
 
Регистрация: 07.03.2010
Сообщений: 647
Сказал(а) спасибо: 100
Поблагодарили 252 раз(а) в 123 сообщениях
LordJZ Как самоцвет среди гранитаLordJZ Как самоцвет среди гранитаLordJZ Как самоцвет среди гранита
По умолчанию

Цитата:
Сообщение от zergtmn Посмотреть сообщение
Пытаюсь сделать, чтобы моб в момент смерти кастовал АоЕ спелл, например http://ru.wowhead.com/spell=62598 (с помощью EAI или SD2, не важно). Анимация есть, но спелл промахивается в 100% случаев (кастуется как triggered). В чем дело? (:
Ревизия 9808.
А как вы делаете? Через JustDied?
LordJZ вне форума   Ответить с цитированием
Старый 03.05.2010, 23:57   #48
zergtmn
MaNGOS Dev
 
Аватар для zergtmn
 
Регистрация: 07.03.2010
Сообщений: 314
Сказал(а) спасибо: 30
Поблагодарили 153 раз(а) в 83 сообщениях
zergtmn Обладатель прекрасной аурыzergtmn Обладатель прекрасной ауры
По умолчанию

Цитата:
Сообщение от LordJZ Посмотреть сообщение
А как вы делаете? Через JustDied?
Да, в EventAI это EVENT_T_DEATH (6). Можете сами убедиться:
Код:
UPDATE creature_template SET AIName = 'EventAI', ScriptName = '' WHERE entry IN (32918);
DELETE FROM creature_ai_scripts WHERE creature_id IN (32918);
INSERT INTO creature_ai_scripts VALUES
('3291801','32918','0','0','100','7','5000','10000','10000','12000','11','62608','1','0','0','0','0','0','0','0','0','0','Detonating Lasher - Cast Flame Lash'),
('3291802','32918','6','0','100','2','0',   '0',    '0',    '0',    '11','62598','0','3','0','0','0','0','0','0','0','0','Detonating Lasher (Normal) - Cast Detonate on Death'),
('3291803','32918','6','0','100','4','0',   '0',    '0',    '0',    '11','62937','0','3','0','0','0','0','0','0','0','0','Detonating Lasher (Heroic) - Cast Detonate on Death');
zergtmn вне форума   Ответить с цитированием
Старый 04.05.2010, 07:53   #49
LordJZ
Супер-модератор
 
Аватар для LordJZ
 
Регистрация: 07.03.2010
Сообщений: 647
Сказал(а) спасибо: 100
Поблагодарили 252 раз(а) в 123 сообщениях
LordJZ Как самоцвет среди гранитаLordJZ Как самоцвет среди гранитаLordJZ Как самоцвет среди гранита
По умолчанию

Ох уж это EventAI...
Попробуйте поставить мобу 1 хп INVINCIBILITY_LEVEL (кажется так), и на 1 хп кастануть этот спелл и умереть.
LordJZ вне форума   Ответить с цитированием
Старый 04.05.2010, 23:02   #50
zergtmn
MaNGOS Dev
 
Аватар для zergtmn
 
Регистрация: 07.03.2010
Сообщений: 314
Сказал(а) спасибо: 30
Поблагодарили 153 раз(а) в 83 сообщениях
zergtmn Обладатель прекрасной аурыzergtmn Обладатель прекрасной ауры
По умолчанию

Сделал новый тип события EVENT_T_JUST_BEFORE_DEATH, который обрабатывается в DamageTaken при получении последнего удара.
zergtmn вне форума   Ответить с цитированием
Старый 12.05.2010, 09:30   #51
MangMan
Новичок
 
Аватар для MangMan
 
Регистрация: 24.03.2010
Сообщений: 25
Сказал(а) спасибо: 11
Поблагодарили 14 раз(а) в 7 сообщениях
Записей в дневнике: 6
MangMan На верном пути
По умолчанию

Подскажите где проверяется разница рейтов арены. Дапустим у одной тимы 300 а у другой 800.Они не могут участвовать в месте, потому что разница большая.
MangMan вне форума   Ответить с цитированием
Старый 12.05.2010, 10:33   #52
srv38
Пользователь
 
Регистрация: 07.03.2010
Сообщений: 40
Сказал(а) спасибо: 29
Поблагодарили 13 раз(а) в 5 сообщениях
srv38 На верном пути
По умолчанию

В конфиге есть такой параметр, по дефолту вроде 150, думаю с него и надо начинать поиск.
srv38 вне форума   Ответить с цитированием
Старый 18.08.2010, 15:53   #53
pavelzubkov
Гость
 
Сообщений: n/a
По умолчанию

Помогите разобраться в коде. Mangos 0.12 кум 6928
Я тут посмотрел написал комментарии по правьте если ошибся. Я может и понимаю код, но что, для чего и зачем мне не понятно. Опишите пожалуйста функции которые в примере. Как я понимаю эта процедура почти стартовая при исполнение кода спеллов(еще старше та которая ее вызывает)
Код:
void WorldSession::HandleCastSpellOpcode(WorldPacket& recvPacket)
{
    CHECK_PACKET_SIZE(recvPacket,4+1+2);

    uint32 spellId;//Объявление двух переменных. Со SpellId понятно
    uint8  cast_count;//Что храниться здесь??? И для ВНЕЗАПНОГО УДАРА и для ЛЕДЯННОЙ СТРЕЛЫ - 0.
    recvPacket >> spellId;
    recvPacket >> cast_count;

    sLog.outDebug("WORLD: got cast spell packet, spellId - %u, cast_count: %u data length = %i",
        spellId, cast_count, recvPacket.size()); //Логи

    SpellEntry const *spellInfo = sSpellStore.LookupEntry(spellId );
	/*
	В SpellEntry содержется описание ячеек из spell.dbc
	клик по sSpellStore >>>>  GO TO DEFINITION приводит к     DBCStorage <SpellEntry> sSpellStore(SpellEntryfmt); судя по всему, описание какого-то DBC????
	клик по LookupEntry >>>>  GO TO DEFINITION приводит к    T const* LookupEntry(uint32 id) const { return (id>=nCount)?NULL:indexTable[id]; } 
	                                                                                                            не могу понять конструкцию, вроде тут условие и возвращение какого-то id???
	судя по *SpellInfo...ммм, название говорит само за  себя.
	*/

    if(!spellInfo)//проверка на успешное создание spellInfo
    {
        sLog.outError("WORLD: unknown spell id %u", spellId);
        return;
    }

    // not have spell or spell passive and not casted by client(с английским проблемы) что-то вроде: не имеется спелл или спел пассивный и нет каста от клиента. вроде так.
    if ( !_player->HasSpell (spellId) || IsPassiveSpell(spellId) )//Проверка на читерство???
    {
        //cheater? kick? ban? 
        return;
    }

    // client provided targets
    SpellCastTargets targets;//Создание таргета
    if(!targets.read(&recvPacket,_player))//Проверка на существование таргета?
        return;

    // auto-selection buff level base at target level (in spellInfo)  Это мне не дано перевсти: авто-выбор полезного эфекта базового уровня....бррр......
    if(targets.getUnitTarget())
    {
        SpellEntry const *actualSpellInfo = spellmgr.SelectAuraRankForPlayerLevel(spellInfo,targets.getUnitTarget()->getLevel());
		                            /*
		                               GO TO DEFINITION(SelectAuraRankForPlayerLevel) - SpellEntry const* SelectAuraRankForPlayerLevel(SpellEntry const*   spellInfo, uint32 playerLevel) const;//  --- это прототип функции?? 
                                               //А где тело функции описывается...хм...spellmrg.cpp 
                                               //go to definition привело меня в spellmrg.h, понятно.
                                               SpellEntry const* SpellMgr::SelectAuraRankForPlayerLevel(SpellEntry const* spellInfo, uint32 playerLevel) const   //посмотрим чё тут=)
                                              {
                                                 // ignore passive spells игнорирование пассивных спеллов
                                                 if(IsPassiveSpell(spellInfo->Id))
                                                 return spellInfo; //Возвращаем изначальное спеллинфо

                                                 bool needRankSelection = false;//объявляем буль
                                                 for(int i=0;i<3;i++)//такс цикл 
                                              {
                                                  if( IsPositiveEffect(spellInfo->Id, i) && ( spellInfo->Effect[i] == SPELL_EFFECT_APPLY_AURA || spellInfo->Effect[i] == SPELL_EFFECT_APPLY_AREA_AURA_PARTY ) )
                                               {//Если в spell.dbc хоть одна из ячеек effect равна SPELL_EFFECT_APPLY_AURA ||(или) SPELL_EFFECT_APPLY_AREA_AURA_PARTY
	                                          //а вот IsPositiveEffect(spellInfo->Id, i)  как Я ПОНЯЛ там внутри идет проверка из множества свитч 
                                                   кэйсов и другой бурды 
	                                         //на полезный или вредный эффект спелла(всмысле эффект у спела положительный(хилит, бафает) 
                                                   или отрицательный(урон...))
                                                 needRankSelection = true; //еслив хоть раз условие верно буль будет истин
                                                 break;//и выходим из цикла
                                               }
                                            }

                                           // not required
                                           if(!needRankSelection)//т.к буль НЕ истин
                                           return spellInfo;//Возвращаем изначальное спеллинфо

                                           for(uint32 nextSpellId = spellInfo->Id; nextSpellId != 0; nextSpellId = GetPrevSpellInChain(nextSpellId))
                                           {
                                             SpellEntry const *nextSpellInfo = sSpellStore.LookupEntry(nextSpellId);//опять шесть сот двадцать пять
                                             if(!nextSpellInfo)//а есть ли оно?
                                             break;//нет

                                             // if found appropriate level
                                             if(playerLevel + 10 >= nextSpellInfo->spellLevel)//больши или равен левел игрока уровня спелла??
                                             return nextSpellInfo; //возвращаем nextSpellInfo

                                             // one rank less then 
                                           }

                                        // not found
                                        return NULL;//ничего
                                        }//Вообщем, я не понял что эта функция делает=)моски надо купить
		                    */

        // if rank not found then function return NULL but in explicit cast case original spell can be casted and later failed with appropriate error message
        if(actualSpellInfo)//если не нулл
            spellInfo = actualSpellInfo;
    }

    Spell *spell = new Spell(_player, spellInfo, false);//конструктор,хм _player, spellInfo, false. false - это тригерность???
    spell->m_cast_count = cast_count;                       // set count of casts пожалуйста скажите для чего cast_count
    spell->prepare(&targets);//Это следующее что я должен смотреть если хочу идти по следам спелла???
}//фуу вот и все

Последний раз редактировалось pavelzubkov; 18.08.2010 в 18:16.
  Ответить с цитированием
Старый 18.08.2010, 16:40   #54
MaS0n
Модератор
 
Регистрация: 09.03.2010
Адрес: dev/null
Сообщений: 126
Сказал(а) спасибо: 44
Поблагодарили 111 раз(а) в 47 сообщениях
MaS0n Скоро придёт к известностиMaS0n Скоро придёт к известности
Отправить сообщение для MaS0n с помощью ICQ
По умолчанию

Код:
void WorldSession::HandleCastSpellOpcode(WorldPacket& recvPacket)
{
    CHECK_PACKET_SIZE(recvPacket,4+1+2);

    uint32 spellId; // ID спелла
    uint8  cast_count; // количество кастов, увеличивается с каждым новым кастом для конкретного спелла
    recvPacket >> spellId;
    recvPacket >> cast_count;

    sLog.outDebug("WORLD: got cast spell packet, spellId - %u, cast_count: %u data length = %i",
        spellId, cast_count, recvPacket.size()); //Логи

    SpellEntry const *spellInfo = sSpellStore.LookupEntry(spellId );
    /* Обьект SpellEntry - получение информации по спеллу из DBC */
    /* т.е мы можем обращатся к полям структуры, типа spellInfo->ID, spellInfo->SpellIconID, см. DBCStructure.h, struct SpellEntry */

    if(!spellInfo)//проверка на успешное создание spellInfo
    {
        sLog.outError("WORLD: unknown spell id %u", spellId);
        return;
    }

    // not have spell or spell passive and not casted by client (нет данного спелла у игрока или спелл пассивный - а значит НИКАК не может быть скастован клиентом => читер
    if ( !_player->HasSpell (spellId) || IsPassiveSpell(spellId) )//Проверка на читерство???
    {
        //cheater? kick? ban? 
        return;
    }

    // client provided targets
    SpellCastTargets targets; //Создание таргета
    if(!targets.read(&recvPacket,_player)) // Чтение целей из пакета и занесение их в таргет обработку
        return;

    // auto-selection buff level base at target level (in spellInfo)  (выбор уровня спелла согласно левелу чара)
    if(targets.getUnitTarget())
    {
        SpellEntry const *actualSpellInfo = spellmgr.SelectAuraRankForPlayerLevel(spellInfo,targets.getUnitTarget()->getLevel());
		/*
		GO TO DEFINITION(SelectAuraRankForPlayerLevel) - SpellEntry const* SelectAuraRankForPlayerLevel(SpellEntry const* spellInfo, uint32 playerLevel) const;  --- это прототип функции?? А где тело функции описывается...хм...spellmrg.cpp go to definition привело меня в spellmrg.h, понятно.
SpellEntry const* SpellMgr::SelectAuraRankForPlayerLevel(SpellEntry const* spellInfo, uint32 playerLevel) const //посмотрим чё тут=)
{
    // ignore passive spells игнорирование пассивных спеллов
    if(IsPassiveSpell(spellInfo->Id))
        return spellInfo; //Возвращаем изначальное спеллинфо

    bool needRankSelection = false;//объявляем буль
    for(int i=0;i<3;i++)//такс цикл 
    {
        if( IsPositiveEffect(spellInfo->Id, i) && ( spellInfo->Effect[i] == SPELL_EFFECT_APPLY_AURA || spellInfo->Effect[i] == SPELL_EFFECT_APPLY_AREA_AURA_PARTY ) )
        {//Если в spell.dbc хоть одна из ячеек effect равна SPELL_EFFECT_APPLY_AURA ||(или) SPELL_EFFECT_APPLY_AREA_AURA_PARTY
	//а вот IsPositiveEffect(spellInfo->Id, i)  как Я ПОНЯЛ там внутри идет проверка из множества свитч кэйсов и другой бурды 
	//на полезный или вредный эффект спелла(всмысле эффект у спела положительный(хилит, бафает) или отрицательный(урон...))
            needRankSelection = true; //еслив хоть раз условие верно буль будет истин
            break;//и выходим из цикла
        }
    }

    // not required
    if(!needRankSelection)//т.к буль НЕ истин
        return spellInfo;//Возвращаем изначальное спеллинфо

    for(uint32 nextSpellId = spellInfo->Id; nextSpellId != 0; nextSpellId = GetPrevSpellInChain(nextSpellId))
    {
        SpellEntry const *nextSpellInfo = sSpellStore.LookupEntry(nextSpellId);//опять шесть сот двадцать пять
        if(!nextSpellInfo)//а есть ли оно?
            break;//нет

        // if found appropriate level
        if(playerLevel + 10 >= nextSpellInfo->spellLevel)//больши или равен левел игрока уровня спелла??
            return nextSpellInfo; //возвращаем nextSpellInfo

        // one rank less then 
    }

    // not found
    return NULL;//ничего
}//Вообщем я ни понял что эта функция делает=)моски надо купить
		*/

        // if rank not found then function return NULL but in explicit cast case original spell can be casted and later failed with appropriate error message
        if(actualSpellInfo)//если не нулл
            spellInfo = actualSpellInfo;
    }

    Spell *spell = new Spell(_player, spellInfo, false);
// конструктор - создаем обьект Spell
// Spell::Spell( Unit* Caster, SpellEntry const *info, bool triggered)
    spell->m_cast_count = cast_count;                       // устаналиваем количество кастов в глобальную переменнную для дальнейших расчетов
    spell->prepare(&targets);// Переход в фазу подготовки спелла
}//фуу вот и все
Это же не с лича пакет, я так понимаю, структура не совпадает, это классик или тбц
Я изменил комменты кое-где, почитай - возникнут вопросы - пиши

Последний раз редактировалось MaS0n; 18.08.2010 в 16:52.
MaS0n вне форума   Ответить с цитированием
Пользователь сказал cпасибо:
Старый 18.08.2010, 18:14   #55
pavelzubkov
Гость
 
Сообщений: n/a
По умолчанию

так значит функция sSpellStore.LookupEntry(spellId) возвращает данные о спелле из dbc.
Цитата:
uint8 cast_count; // количество кастов, увеличивается с каждым новым кастом для конкретного спелла
А для чего это используеться? Что бы подсчитать стаки как-либо эффектов? Диминишинг?
Цитата:
// auto-selection buff level base at target level (in spellInfo) (выбор уровня спелла согласно левелу чара)
Всмысле? Т.е. в функции SpellEntry const* SpellMgr::SelectAuraRankForPlayerLevel(SpellEntry const* spellInfo, uint32 playerLevel) const - определяеться какй уровень спелла использовал player?В actualSpellInfo данные о спелле соответственного уровня.
  Ответить с цитированием
Старый 18.08.2010, 19:23   #56
LordJZ
Супер-модератор
 
Аватар для LordJZ
 
Регистрация: 07.03.2010
Сообщений: 647
Сказал(а) спасибо: 100
Поблагодарили 252 раз(а) в 123 сообщениях
LordJZ Как самоцвет среди гранитаLordJZ Как самоцвет среди гранитаLordJZ Как самоцвет среди гранита
По умолчанию

cast_count, вроде бы, в мангосе не используется, но я могу ошибаться.
LordJZ вне форума   Ответить с цитированием
Старый 18.08.2010, 20:02   #57
MaS0n
Модератор
 
Регистрация: 09.03.2010
Адрес: dev/null
Сообщений: 126
Сказал(а) спасибо: 44
Поблагодарили 111 раз(а) в 47 сообщениях
MaS0n Скоро придёт к известностиMaS0n Скоро придёт к известности
Отправить сообщение для MaS0n с помощью ICQ
По умолчанию

Используется.
Для чего - не знаю, мб для вычислений, например предотвращения зацикливания триггера в deadloop, обработки мульти-кастов и т.д

Насчет уровня спелла - да
MaS0n вне форума   Ответить с цитированием
Старый 19.08.2010, 10:20   #58
pavelzubkov
Гость
 
Сообщений: n/a
По умолчанию По следу спелла=)

Я правильно понял? Критика моим комментариям приветствуется=)

Код:
void Spell::prepare(SpellCastTargets * targets, Aura* triggeredByAura)/*Подготовка спелла*/
{
    m_targets = *targets;/*Аргумент *targets нужен только для этого присваивания(еще не придумал как выразиться(*/


    m_spellState = SPELL_STATE_PREPARING;/*Статистика спелла - подготовка*/

    m_castPositionX = m_caster->GetPositionX();
    m_castPositionY = m_caster->GetPositionY();
    m_castPositionZ = m_caster->GetPositionZ();
    m_castOrientation = m_caster->GetOrientation();
    /*Получение координат и ориентации кастера*/
    if(triggeredByAura)/**/
        m_triggeredByAuraSpell  = triggeredByAura->GetSpellProto();

    // create and add update event for this spell Создание события для спелла?
    SpellEvent* Event = new SpellEvent(this);//Создаем ЭВЕНТ для нашего спелла
    m_caster->m_Events.AddEvent(Event, m_caster->m_Events.CalculateTime(1));/*Что за тайм считается? Время создания ЭВЕНТА? И для чего он создаеться?*/
    /*Если не ошибаюсь ЭВЕНТ - событие. Создается событие для спелла?*/
	//Prevent casting at cast another spell (ServerSide check) ??? /*Английский под учим, потом.*/
    if(m_caster->IsNonMeleeSpellCasted(false, true) && m_cast_count)/*Милишный спелл и m_cast_count*/
    {
		/*Я прав что тут условие вида: if (m_caster->IsNonMeleeSpellCasted(false, true) == true && m_cast_count == true) {...}
		но ведь m_cast_count не bool. Или он false если равен нулю и true если не равен нулю, ведь так?*/
        SendCastResult(SPELL_FAILED_SPELL_IN_PROGRESS);//Отправка клиенту сведений о неудачном касте.
        finish(false);/*Finish(bool) - это процедура говорящая о конце подготовки еслив на false то подготовка окончилась не удачей?*/
        return;
    }

    // Fill cost data /*Данные о затратах на спелл(мана, энергия, ярость)*/
    m_powerCost = CalculatePowerCost();/*CalculatePowerCost() подсчитывает затраты*/

    uint8 result = CanCast(true);/*В CanCast проверяется возможность каста??*/
    if(result != 0 && !IsAutoRepeat())                  /*Всегда повторяем каст...*/    //always cast autorepeat dummy for triggering
    {
        if(triggeredByAura)/*Опять проверка на аргумент, который мы не передавали из WorldSession::HandleCastSpellOpcode*/
        {/*И если он есть что-то делаем...*/
            SendChannelUpdate(0);
            triggeredByAura->SetAuraDuration(0);
        }
        SendCastResult(result);/*Посылка клиенту сведений о неудачи?????*/
        finish(false);
        return;
    }

    // calculate cast time (calculated after first CanCast check to prevent charge counting for first CanCast fail)
    m_casttime = GetSpellCastTime(m_spellInfo, this);/*Достаем время каста спелла*/

    // set timer base at cast time
    ReSetTimer();/*Какой-то таймер ресаем*/
	/*void ReSetTimer() { m_timer = m_casttime > 0 ? m_casttime : 0; } эта констция значит*/
//	: 
//void ReSetTimer() 
//{
//	if (m_casttime > 0)
//	{
//	m_timer = m_casttime;
//	}
//      else {m_timer = 0;}       
//}
	
    // stealth must be removed at cast starting (at show channel bar) Незаметность должна быть отменена при старте спелла?
    // skip triggered spell (item equip spell casting and other not explicit character casts/item uses) Пропуск триггерного спелла?
    if ( !m_IsTriggeredSpell && isSpellBreakStealth(m_spellInfo) )/*функция isSpellBreakStealth(m_spellInfo) определяет выводит ли спелл из режима незаметности??*/
    {
        m_caster->RemoveSpellsCausingAura(SPELL_AURA_MOD_STEALTH);/*Выход из стелса*/
        m_caster->RemoveSpellsCausingAura(SPELL_AURA_FEIGN_DEATH);/*Воскрешение????*/
    }

    if(m_IsTriggeredSpell)/*Тригерный ли спелл, если да каст(тру)*/
        cast(true);/*Кастуется то что вызывает тригер??*/
    else
    {/*нет*/
        m_caster->SetCurrentCastedSpell( this );/*Установление значений каста спелла. Там определяется крита, мисс, доджи, блок, пар...?*/
        m_selfContainer = &(m_caster->m_currentSpells[GetCurrentContainer()]);/*?*/
        SendSpellStart();/*Передача данных о старте спелла??*/
    }
}

Последний раз редактировалось pavelzubkov; 19.08.2010 в 20:18. Причина: Что-то узнал до чего-то додумался, поправлю коменты.
  Ответить с цитированием
Старый 19.08.2010, 14:08   #59
Vladimir
MaNGOS Dev
 
Регистрация: 09.02.2010
Сообщений: 594
Сказал(а) спасибо: 315
Поблагодарили 438 раз(а) в 181 сообщениях
Vladimir Как свет с небесVladimir Как свет с небесVladimir Как свет с небесVladimir Как свет с небесVladimir Как свет с небесVladimir Как свет с небес
По умолчанию

Цитата:
Сообщение от MaS0n Посмотреть сообщение
Используется.
Для чего - не знаю, мб для вычислений, например предотвращения зацикливания триггера в deadloop, обработки мульти-кастов и т.д

Насчет уровня спелла - да
Насколько помню в 2.x клиенте появилась возможность старта каста до подтверждения сервера об окончании предыдущего.
Т.е. игрок жмет каст - клиент видит что сервер не сообщил об окончании предыдущего каста, но посылает пакет каста серверу с +1 номером в упомянутом поле.
Сервер уже сам разбирается можно разрешить каст или нет.
Помогает при лагах когда клиент раньше не давал кастовать из-за лагов хотя по времени формально каст должен был уже закончится предыдущий.
__________________
Так как устал объяснять знайте ICQ не пользуюсь
Vladimir вне форума   Ответить с цитированием
Пользователь сказал cпасибо:
Старый 19.08.2010, 18:54   #60
pavelzubkov
Гость
 
Сообщений: n/a
По умолчанию

Небольшой вопрос(на примере) по функциям в с++:
есть функция void WorldSession::HandleCastSpellOpcode(WorldPacket& recvPacket) из которой вызываеться другая функция void Spell:repare(SpellCastTargets * targets, Aura* triggeredByAura) и вот при вызове второй функции указываеться только один аргумент SpellCastTargets * targets, а второй нет. Как я понимаю на примере в предыдущих сообщениях функция вызовется, НО triggeredByAura(второй аргумент последней функции) будет не инициализирован. Я поторопился...нашел в spell.h прототип этой функции
void prepare(SpellCastTargets * targets, Aura* triggeredByAura = NULL); zergtmn стараюсь читать

Последний раз редактировалось pavelzubkov; 19.08.2010 в 19:22. Причина: Ответил сам.
  Ответить с цитированием
Старый 19.08.2010, 19:08   #61
zergtmn
MaNGOS Dev
 
Аватар для zergtmn
 
Регистрация: 07.03.2010
Сообщений: 314
Сказал(а) спасибо: 30
Поблагодарили 153 раз(а) в 83 сообщениях
zergtmn Обладатель прекрасной аурыzergtmn Обладатель прекрасной ауры
По умолчанию

Советую вам почитать книжки по С++.
zergtmn вне форума   Ответить с цитированием
Старый 18.01.2011, 18:48   #62
Wish
Новичок
 
Регистрация: 07.03.2010
Сообщений: 11
Сказал(а) спасибо: 18
Поблагодарили 2 раз(а) в 1 сообщении
Wish На верном пути
По умолчанию

Снова нужна помощь
решил переделать определение уровня гма, мне удобней чтобы все аккаунты на которые я захожу со своего айпи бали гмские
в accountmgr.cpp я прописываю
std::string IP_str = GetRemoteAddress();
и меняю запрос на нужный мне
при компиляции пишет неизвестный индификатор
пробовал так
player()->Getsesion()->GetRemoteAddress();
тоже неможет найти индефикатор

Подскажите что поправить
Wish вне форума   Ответить с цитированием
Старый 18.01.2011, 19:28   #63
Feel the Power
Пользователь
 
Аватар для Feel the Power
 
Регистрация: 07.03.2010
Адрес: Беларусь, Минск
Сообщений: 58
Сказал(а) спасибо: 92
Поблагодарили 40 раз(а) в 17 сообщениях
Feel the Power Скоро придёт к известности
Отправить сообщение для Feel the Power с помощью ICQ
По умолчанию

Цитата:
Сообщение от Wish Посмотреть сообщение
Снова нужна помощь
решил переделать определение уровня гма, мне удобней чтобы все аккаунты на которые я захожу со своего айпи бали гмские
в accountmgr.cpp я прописываю
std::string IP_str = GetRemoteAddress();
и меняю запрос на нужный мне
при компиляции пишет неизвестный индификатор
пробовал так
player()->Getsesion()->GetRemoteAddress();
тоже неможет найти индефикатор

Подскажите что поправить
А библиотека std подключена в accountmgr.cpp?
Feel the Power вне форума   Ответить с цитированием
Старый 18.01.2011, 20:42   #64
rsa
Почетный флудер
Старожил
 
Аватар для rsa
 
Регистрация: 08.03.2010
Адрес: Мурманск, Россия
Сообщений: 788
Сказал(а) спасибо: 55
Поблагодарили 333 раз(а) в 151 сообщениях
Записей в дневнике: 1
rsa Как самоцвет среди гранитаrsa Как самоцвет среди гранитаrsa Как самоцвет среди гранитаrsa Как самоцвет среди гранита
По умолчанию

rsa вне форума   Ответить с цитированием
Старый 19.01.2011, 17:19   #65
Wish
Новичок
 
Регистрация: 07.03.2010
Сообщений: 11
Сказал(а) спасибо: 18
Поблагодарили 2 раз(а) в 1 сообщении
Wish На верном пути
По умолчанию

Цитата:
Сообщение от Feel the Power Посмотреть сообщение
А библиотека std подключена в accountmgr.cpp?
std подключена
WorldSocket.h подключаю, также выдает ошибку что найти не может
Wish вне форума   Ответить с цитированием
Старый 19.01.2011, 18:34   #66
Sid
Ученый
 
Аватар для Sid
 
Регистрация: 02.04.2010
Сообщений: 237
Сказал(а) спасибо: 41
Поблагодарили 99 раз(а) в 44 сообщениях
Sid Скоро придёт к известностиSid Скоро придёт к известности
По умолчанию

Имхо AccMgr это менеджер для работы с базой акков и не более. Тебе нужно копать WorldSession или AuthSocket.
Sid вне форума   Ответить с цитированием
Старый 20.03.2011, 09:20   #67
HuntsMan
Ученый
 
Аватар для HuntsMan
 
Регистрация: 19.12.2010
Сообщений: 221
Сказал(а) спасибо: 64
Поблагодарили 12 раз(а) в 9 сообщениях
Записей в дневнике: 2
HuntsMan На верном пути
По умолчанию

Каким образом экстрактор определяет что определенная карта должна иметь флаг DARKWATER? Старая тема от andstan'a на old.ru-mangos.ru не полностью
HuntsMan вне форума   Ответить с цитированием
Старый 14.05.2011, 15:05   #68
HuntsMan
Ученый
 
Аватар для HuntsMan
 
Регистрация: 19.12.2010
Сообщений: 221
Сказал(а) спасибо: 64
Поблагодарили 12 раз(а) в 9 сообщениях
Записей в дневнике: 2
HuntsMan На верном пути
По умолчанию

Подскажите пожалуйста, какой SpellCastResult посылается клиенту, если спелл кастуется в движении, но в движении этот спелл кастовать нельзя?
HuntsMan вне форума   Ответить с цитированием
Старый 14.05.2011, 16:59   #69
Den
Ученый
 
Регистрация: 10.03.2010
Адрес: Бобруйск
Сообщений: 284
Сказал(а) спасибо: 213
Поблагодарили 98 раз(а) в 84 сообщениях
Den Скоро придёт к известностиDen Скоро придёт к известности
По умолчанию

SPELL_FAILED_MOVING = 51, // Невозможно делать это на ходу.
Den вне форума   Ответить с цитированием
Пользователь сказал cпасибо:
HuntsMan (14.05.2011)
Старый 24.07.2011, 03:50   #70
acteros
Новичок
 
Регистрация: 25.06.2010
Адрес: Lipetsk
Сообщений: 21
Сказал(а) спасибо: 4
Поблагодарили 0 раз(а) в 0 сообщениях
acteros На верном пути
По умолчанию

как можно задать шанс крита спелу?
Например если весит аура ток спел с вероятностью в x% должен нанести крит урон
acteros вне форума   Ответить с цитированием
Старый 24.07.2011, 07:18   #71
Den
Ученый
 
Регистрация: 10.03.2010
Адрес: Бобруйск
Сообщений: 284
Сказал(а) спасибо: 213
Поблагодарили 98 раз(а) в 84 сообщениях
Den Скоро придёт к известностиDen Скоро придёт к известности
По умолчанию

bool Unit::IsSpellCrit(...)
Den вне форума   Ответить с цитированием
Ответ


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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
trinity (world) to mangos (mangos) Timmy-kr Корзина 1 02.06.2010 04:51


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


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