Ru-MaNGOS

Ru-MaNGOS (http://mangos.ytdb.ru/index.php)
-   Языки программирования (http://mangos.ytdb.ru/forumdisplay.php?f=34)
-   -   Начинающим разбираться в коде MaNGOS (http://mangos.ytdb.ru/showthread.php?t=174)

Wish 09.03.2010 13:15

Начинающим разбираться в коде MaNGOS
 
Помню гдето был патч на комманду ст, при использование ее, когда ты дух, тебя телепортировало на близайщее кладбище, воскрещало и кидало
Собственно патч данный я не смог найти, решил сам написать

Вроде все нормально при юзание комманды ст, он тп к кладбищу и воскрещается, но немогу реализовать добавление ауры (http://www.wowhead.com/?spell=15007) к персу, лазил в коде искал примеры, конкретного ничего не нашел(может и видел, но собственно незнаю как она зовется там)

Кто знает прошу помочь

BombermaG 09.03.2010 13:20

Для начала стоит ссылочки указывать на wowhead, а не какой-то лан сайт :)

Wish 09.03.2010 13:23

Цитата:

Сообщение от BombermaG (Сообщение 869)
Для начала стоит ссылочки указывать на wowhead, а не какой-то лан сайт :)

чтож бывает, как вы заметили это лан сайт, где мне удобней работать, чем на вовхеде

virusav 09.03.2010 22:33

В скрипте СД2 использовал:
Код:

pPlayer->CastSpell(pPlayer,SPELL_ID,false);
, где Player* pPlayer.

Работает, подставь свой спелл вместо SPELL_ID и проверь.

Wish 10.03.2010 04:47

Цитата:

Сообщение от virusav (Сообщение 1049)
В скрипте СД2 использовал:
Код:

pPlayer->CastSpell(pPlayer,SPELL_ID,false);
, где Player* pPlayer.

Работает, подставь свой спелл вместо SPELL_ID и проверь.

Спасибо
chr->CastSpell(chr,15007,false);
Не подскажите для чего в свойствах функции, последнее свойство, тру, фолс?

virusav 10.03.2010 09:16

Если не ошибаюсь, последний параметр отвечает за триггерность спелла, т.е. если спелл триггерный, то ставим true, иначе false.

Wish 10.03.2010 11:35

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

Предлагаю тему переименовать в "Изучение кода мангоса", помнится такая была на предыдущем форуме и автор был ее Kirix, столько полезной инфы было в ней:sorry:

Еще 1 вопрос
что нужно подключить или прописать чтобы данный код работал
PHP код:

if(int32(getLevel()) < startLevel+9)
        {
            
int32 delta = (int32(getLevel()) - startLevel 1)*MINUTE;

            if(
Aura aur GetAura(15007GetGUID()))


При попытке скомпилировать выдает ошибку в неизвестных идентификаторах

KiriX 10.03.2010 12:43

Цитата:

Сообщение от Wish (Сообщение 1122)
virusav
Спасибо за оказанное время и помощь, вроде проект обучающий но помогаете один только вы

Предлагаю тему переименовать в "Изучение кода мангоса", помнится такая была на предыдущем форуме и автор был ее Kirix, столько полезной инфы было в ней:sorry:

Еще 1 вопрос
что нужно подключить или прописать чтобы данный код работал
PHP код:

if(int32(getLevel()) < startLevel+9)
        {
            
int32 delta = (int32(getLevel()) - startLevel 1)*MINUTE;

            if(
Aura aur GetAura(15007GetGUID()))


При попытке скомпилировать выдает ошибку в неизвестных идентификаторах

1) Не все успевают моментально ответить на появляющиеся вопросы. Лично я три своих выходных полностью посвятил настройке форума, было не до заполнения. А сейчас я работаю - времени мало...
2) Спасибо что напомнили о хорошей теме. Ваше пожелание учтено =)

Dereka 10.03.2010 12:44

Цитата:

Сообщение от Wish (Сообщение 1122)
Еще 1 вопрос
что нужно подключить или прописать чтобы данный код работал
PHP код:

if(int32(getLevel()) < startLevel+9)
        {
            
int32 delta = (int32(getLevel()) - startLevel 1)*MINUTE;

            if(
Aura aur GetAura(15007GetGUID()))


При попытке скомпилировать выдает ошибку в неизвестных идентификаторах

ищи где описаны getLevel() GetAura() и чей GetGUID() тебе нужен
потом прописывай эти хеадеры(*.h файлы) в своём .cpp файле

KiriX 10.03.2010 13:00

А что, функции воскрешения отсутствует или она отделена от наложения маски воскрешения?

Сейчас на работе - под рукой нет исходников =)

Wish 10.03.2010 13:10

Цитата:

Сообщение от KiriX (Сообщение 1138)
А что, функции воскрешения отсутствует или она отделена от наложения маски воскрешения?

отделена,
воскрешение прописано так
Цитата:

Сообщение от Dereka (Сообщение 1136)
ищи где описаны getLevel() GetAura() и чей GetGUID() тебе нужен
потом прописывай эти хеадеры(*.h файлы) в своём .cpp файле

Прописывал эти самые *.h файлы в инклуде, но ошибка таже, неизсветный идентификатор
getLevel, GetGUID, предполагаю они конкретно не определены в *.h файлах, а определяются при юзание опредленно какихто моментов
если муть несу, то не пинайте пожалуйста, я пытаюсь понять неизвестное мне

LordJZ 10.03.2010 14:15

Код:

if(Aura * aur = GetAura(15007, EFFECT_INDEX_0))
GetGUID() тут ни к чему.

MaS0n 10.03.2010 17:42

использование функций GetAura() и getLevel() напрямую можно только в Player.cpp, Unit.cpp. Это аналогично this->getLevel(), this->GetAura(). В остальных случаях требуется игрок(или юнит), с которого мы получаем левел или ауру
Т.е
Код:

plr->getLevel()
plr->GetAura(..)

PS : и как могут быть не определены эти ф-ци в .h файлах, если вы используете файлы исходников, а не свои добавленные

Wish 10.03.2010 18:34

Цитата:

Сообщение от MaS0n (Сообщение 1189)
использование функций GetAura() и getLevel() напрямую можно только в Player.cpp, Unit.cpp. Это аналогично this->getLevel(), this->GetAura(). В остальных случаях требуется игрок(или юнит), с которого мы получаем левел или ауру
Т.е
Код:

plr->getLevel()
plr->GetAura(..)

PS : и как могут быть не определены эти ф-ци в .h файлах, если вы используете файлы исходников, а не свои добавленные

Спасибо на многие вопросы сразу получил вопрос
Цитата:

Сообщение от LordJZ (Сообщение 1162)
Код:

if(Aura * aur = GetAura(15007, EFFECT_INDEX_0))
GetGUID() тут ни к чему.

собственно EFFECT_INDEX_0 я вообще в коде не нашел существование ее

Вот реализовал что хотел, в игре вроде все отлично работает, ошибок в коде нет?
PHP код:

     // if player is dead and stuck, send ghost to graveyard
    
chr->RepopAtGraveyard();
    
chr->ResurrectPlayer(0.0ffalse);

    
int32 startLevel sWorld.getConfig(CONFIG_DEATH_SICKNESS_LEVEL);

    if(
int32(chr->getLevel()) >= startLevel)
    {
        
// set resurrection sickness
        
chr->CastSpell(chr,15007,false);

        
// not full duration
        
if(int32(chr->getLevel()) < startLevel+9)
        {
            
int32 delta = (int32(chr->getLevel()) - startLevel 1)*MINUTE;

            if(
Aura aur chr->GetAura(15007chr->GetGUID()))
            {
                
aur->SetDuration(delta*IN_MILISECONDS);
            }
        }
    }
    return 
true;
    }

    
// cast spell Stuck
     
chr->RepopAtGraveyard();
     return 
true

и еще пару вопросов
1.unit64,unit32,unit8 и тд, что значит это? и какая разница между ими?
2.Можно ли гдето в коде посмотреть описание функций? к примеру
CastSpell(Обект на который будет задействовано,ИД спелла,Тригерность);

MaS0n 10.03.2010 18:45

Код:

    // if player is dead and stuck, send ghost to graveyard
    chr->RepopAtGraveyard();
    chr->ResurrectPlayer(0.0f, false);

    int32 startLevel = sWorld.getConfig(CONFIG_DEATH_SICKNESS_LEVEL);

    if(int32(chr->getLevel()) >= startLevel)
    {
        // set resurrection sickness
        chr->CastSpell(chr,15007,false);

        // not full duration
        if(int32(chr->getLevel()) < startLevel+9)
        {
            int32 delta = (int32(chr->getLevel()) - startLevel + 1)*MINUTE;

            if(Aura * aur = chr->GetAura(15007, chr->GetGUID()))
            {
                aur->SetDuration(delta*IN_MILISECONDS);
                aur->SetAuraMaxDuration(delta * IN_MILISECONDS);
                aur->RefreshAura();

            }
        }
    }
    return true;
    }

    // cast spell Stuck
    chr->RepopAtGraveyard();
    return true;

1. в GetAura второй параметр нужен индекс эффекта, сейчас не знаю как, а раньше всегда было 0, щас мб EFF_INDEX_0, т.к enum, вобщем смотреть по коду

2. ЧТоб установить свою длительность ауры, надо установить макс. длительность а потом ее зарефрешить

PS - каст маски 15007 лучше делать true, т.к true- означает триггерный спелл, кастуется инстантом, не требуя ни энергии(маны, ярости и т.д), ни реагентов, игонря любые эффекты LOS
Код:

chr->CastSpell(chr,15007,true);
PS2 - Visual Studio там есть такая вещь как "Go to Definition", "Go to Declaration" - в контекст меню правым целчком мыши на ф-ции в коде, первое к самой функции, второе - к ее обьявлению,
uint8, uint16, uint32, uint64 - unsigned int, беззнаковый целочисленный тип, цифра - битовость
беззнаковый - биты могут быть либо 0, либо положительными, за счет отрицательных значений мы вдвое расширяем диапазон, uint32 - 0 to 65536

Это обьясняет и любимый всеми баг с уходом спд в минус и появлятся 65536 при значении < 0

Wish 24.03.2010 07:15

Подскажите еще 2 функции
1. На проверку у персонажа итема
пробовал так GetItemByEntry(entry);
либо нето либо не догнал как прописать
2. На удаление Итема у персонажа
также пробовал RemoveItem
но не догоняю почему при комплиляции ему ненравится она:resent:


По первому вопросу нашел ответ на форуме

I fart 24.03.2010 07:51

Цитата:

Подскажите еще 2 функции
1. На проверку у персонажа итема
пробовал так GetItemByEntry(entry);
либо нето либо не догнал как прописать

2.
Цитата:

2. На удаление Итема у персонажа
также пробовал RemoveItem
Код:

void Player::RemoveItem( uint8 bag, uint8 slot, bool update )
А она разве не для замены? А то есть если true - то замена, false - не замена??

Anti 24.03.2010 13:01

Цитата:

Сообщение от I fart (Сообщение 3003)
Код:

void Player::RemoveItem( uint8 bag, uint8 slot, bool update )
А она разве не для замены? А то есть если true - то замена, false - не замена??

Нет, не для замены:
Код:

        if( IsInWorld() && update )
            pItem->SendCreateUpdateToPlayer( this );

Обновлять ли состояние игрока для самомго игрока или нет. Полагаю, если не обновлять, то итем будет видим для игрока, но будет отсутствовать для сервера.

Цитата:

Сообщение от Wish (Сообщение 1203)
собственно EFFECT_INDEX_0 я вообще в коде не нашел существование ее

Список индексов для спеллов лежит в DBCEnums.h
Код:

enum SpellEffectIndex
{
    EFFECT_INDEX_0    = 0,
    EFFECT_INDEX_1    = 1,
    EFFECT_INDEX_2    = 2
};

Цитата:

Сообщение от Wish (Сообщение 1203)
1.unit64,unit32,unit8 и тд, что значит это? и какая разница между ими?

Описание каждого из типов можно посмотреть в ACE_Wrapper/ace/Basic_Types.h

Цитата:

Сообщение от Wish (Сообщение 1203)
2.Можно ли гдето в коде посмотреть описание функций? к примеру
CastSpell(Обект на который будет задействовано,ИД спелла,Тригерность);

Ну это можно сделать либо в докси, но те что я видел были староватыми, однако инфы там много.
Но самый эффективный вариант (имхо) - просмотр кода.
CastSpell - перегруженный метод, имеющий 4 разных перегрузки.
Используемая нами:
Код:

void CastSpell(float x, float y, float z, uint32 spellId, bool triggered, Item *castItem = NULL, Aura* triggeredByAura = NULL, uint64 originalCaster = 0);
========================

А вообще для лучшего понимания кода, советую пройтись по иерархии классов сущностей. Начиная с Object и вниз. А если вы пользуетесь ВС, то советую сделать следующее:
правой кнопкой мыши по проекту game, в выпадающем меню выбираем "Перейти к схеме классов", ВС немного потупит, но в конце концов успешно создаст схему.

Hantet 24.03.2010 13:31

Простите, а что такое тригерность?
Слово слышу очень давно, но до сих пор не разобрался с этим понятием. :(

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

Спасибо, Anti! Выручил :)

Anti 24.03.2010 13:41

Цитата:

Сообщение от Hantet (Сообщение 3029)
Простите, а что такое тригерность?
Слово слышу очень давно, но до сих пор не разобрался с этим понятием. :(

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

Спел вызывается другим спелом, ну и судя по всему обрабатывается каким-то специфическим способом.

MangMan 24.03.2010 18:46

При осмотре кода Scriptdev увидел такую функцию void ScriptsFree(),
Код:

void ScriptsFree()
{
    // Free Spell Summary
    delete []SpellSummary;

    // Free resources before library unload
    for(int i=0; i<MAX_SCRIPTS; ++i)
        delete m_scripts[i];

    num_sc_scripts = 0;
}

Меня интересует вот эта строка
Код:

delete []SpellSummary;
Правильна ли она?

Anti 24.03.2010 18:57

Цитата:

Сообщение от MangMan (Сообщение 3055)
При осмотре кода Scriptdev увидел такую функцию void ScriptsFree(),
Код:

void ScriptsFree()
{
    // Free Spell Summary
    delete []SpellSummary;

    // Free resources before library unload
    for(int i=0; i<MAX_SCRIPTS; ++i)
        delete m_scripts[i];

    num_sc_scripts = 0;
}

Меня интересует вот эта строка
Код:

delete []SpellSummary;
Правильна ли она?



Обычное удаление динамического массива.

MaS0n 24.03.2010 19:15

Насколько я понимаю по коду, триггерные спеллы не требуют реагентов и энергии, кастятся без учета ЛОС, и видимо инстант

Wish 27.03.2010 09:47

Подскажите как правильно удалить итем
не могу разобраться с RemoveItem

MangMan 27.03.2010 10:09

Код:

RemoveItem(мешок, слот,Обновлять ли состояние игрока для самомго игрока или нет)

Wish 27.03.2010 12:45

Возникает еще один вопрос
Как определить в каком мешке, слоту лежит итем?

MangMan 27.03.2010 12:54

Я код мангоса плохо знаю, но можно так, через цикл, сделать проверку на определенный итим.

Anti 27.03.2010 15:36

Цитата:

Сообщение от Wish (Сообщение 3262)
Возникает еще один вопрос
Как определить в каком мешке, слоту лежит итем?

Посмотрите Player::HasItemCount ну и пишите 2 функции.

Chestarfild 30.03.2010 14:32

Есть ли на данный момент у ГО поддержка функции Update(), как у мобов?

Anti 30.03.2010 16:51

Цитата:

Сообщение от Chesterfield (Сообщение 3437)
Есть ли на данный момент у ГО поддержка функции Update(), как у мобов?

По коду видно, что да.

Код:

void GameObject::Update(uint32 /*p_time*/)
Обрабатывает состояния объектов.

MangMan 03.04.2010 06:54

Описания некоторых функций из фаила Item.cpp

Chestarfild 03.04.2010 10:44

Интересует, как правильно деспавнить ГО в инсте. Например Скорбь в залах, когда её Артас забирает.

Anti 04.04.2010 11:12

Цитата:

Сообщение от Chesterfield (Сообщение 3704)
Интересует, как правильно деспавнить ГО в инсте. Например Скорбь в залах, когда её Артас забирает.

Могу посоветовать посмотреть как это делает rsa в своём скрипте Колизея.
http://github.com/rsa/scriptdev2/blo...e_crusader.cpp

Смотрите скрипт Артоса, он там ломает пол.

Chestarfild 18.04.2010 10:17

Цитата:

По коду видно, что да.
Вот только как это привязать к скрипту? Смотрел в Script, там GetAI() только для креатур, а для го это сделать какнить можно?

Anti 18.04.2010 11:00

Цитата:

Сообщение от Chesterfield (Сообщение 4678)
Вот только как это привязать к скрипту? Смотрел в Script, там GetAI() только для креатур, а для го это сделать какнить можно?

А что реализовываем? Со скриптами ГО не сильно знакомился, но могу достаточно быстро разобраться.

Chestarfild 18.04.2010 13:13

Нужно реализовать таймер в го, чтобы например он каждые 20 секунд выполнял на себя определенный метод. С тригерными нпц не особо охото мучацо, да и не близзлайк это наверное.

ЗЫ: Какими махинациями можно сделать неюзабельный го юзабельным?)

Anti 18.04.2010 14:13

Цитата:

Сообщение от Chesterfield (Сообщение 4687)
Нужно реализовать таймер в го, чтобы например он каждые 20 секунд выполнял на себя определенный метод. С тригерными нпц не особо охото мучацо, да и не близзлайк это наверное.

ЗЫ: Какими махинациями можно сделать неюзабельный го юзабельным?)

Похоже, что не получиться такое реализовать без переписывания большой части кода, да и ан сколько я знаю Го у нас сейчас не кастуют в принципе. Так что лучше "не лезть вперёд батьки", а делать через триггеры.

стамим ГО флаг = 4 - после удаляем (например скриптом).

Chestarfild 18.04.2010 14:40

Цитата:

стамим ГО флаг = 4 - после удаляем (например скриптом).
Я немного не так сказал) Вобщем например, есть сундук в Очищении Стратхольма, он там стоит по дефлоту неюзабельный. Каким флагом/методом/функцией можно его через код сделать юзабельным?

Anti 18.04.2010 17:50

Я тоже имел его ввиду :)

Вроде можно делать через базу, но я предпочитаю через С++ скрипт делать.
В скрипте инста будет примерно такая штука:
Код:

setData(uint32 case,uint32 data)
{
...
    case MALGANIS:
          if (data == DONE)
              if (GameObject *pGo = instance->GetGameObject(MalganisChest))
                    pGo->RemoveFlag(GAMEOBJECT_FLAGS,GO_FLAG_INTERACT_COND);
...
}

А в го_темплейте для этого го ставим значение flags = 4.
Скриптуем моба тоже через С++. И как он умирает и отсылает данные в скрипт инста, тут то мы и делаем ГО юзабильным.

KiriX 28.04.2010 17:07

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

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


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

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