Ru-MaNGOS

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

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

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

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
Старый 12.07.2010, 22:32   #1
virusav
Администратор
 
Аватар для virusav
 
Регистрация: 19.02.2010
Сообщений: 492
Сказал(а) спасибо: 55
Поблагодарили 341 раз(а) в 154 сообщениях
virusav Реально хороший человекvirusav Реально хороший человекvirusav Реально хороший человекvirusav Реально хороший человек
Отправить сообщение для virusav с помощью ICQ
По умолчанию Произнесение фразы игроком

Есть спелл с эффектом SPELL_EFFECT_SCRIPT_EFFECT, которым является произнесение игроком одной из 3 фраз случайным образом.

Через `spell_scripts` сделать не получается, т.к. там указывается код текста явным образом.

Реализовал через СД2, скрипт навесил на итем, но столкнулся в очередной раз с проблемой, что скрипт СД2 отрабатывает, не дожидаясь окончания каста спелла.

В ядре есть функции для игрока:
Код:
void Player::Say(const std::string& text, const uint32 language)
void Player::Yell(const std::string& text, const uint32 language)
...
По идее, данные функции решили бы проблему, но от них пришлось отказаться сразу, т.к. текст будет без локализации.

В коде нашел пример использования одной из функций:
Код:
                    target = this;
                    if (roll_chance_i(10))
                        ((Player*)this)->Say("This is Madness!", LANG_UNIVERSAL);
                    break;
В связи с этим возникли вопросы:
1. Можно ли в ядре как-нибудь заставить игрока произносить фразы, чтобы при этом можно было использовать локализацию, и при этом патч имел бы шансы на принятие (коды фраз в разных базах могут иметь различные значения)?
2. Зачем в коде явным образом указывать фразы, которые нельзя будет перевести ни на один язык (пример выше)?
virusav вне форума   Ответить с цитированием
Старый 13.07.2010, 07:05   #2
rsa
Почетный флудер
Старожил
 
Аватар для rsa
 
Регистрация: 08.03.2010
Адрес: Мурманск, Россия
Сообщений: 788
Сказал(а) спасибо: 55
Поблагодарили 333 раз(а) в 151 сообщениях
Записей в дневнике: 1
rsa Как самоцвет среди гранитаrsa Как самоцвет среди гранитаrsa Как самоцвет среди гранитаrsa Как самоцвет среди гранита
По умолчанию

Цитата:
Сообщение от virusav Посмотреть сообщение
1. Можно ли в ядре как-нибудь заставить игрока произносить фразы, чтобы при этом можно было использовать локализацию, и при этом патч имел бы шансы на принятие (коды фраз в разных базах могут иметь различные значения)?
2. Зачем в коде явным образом указывать фразы, которые нельзя будет перевести ни на один язык (пример выше)?
1. Можно. Код получается толстый и привязанный к базе, но вполне в мэйнстриме.
2. Обломки от старых захардкоженных хаков...

Я себе для такого дела в SD2 спец. функцию встроил, потому как работать с тем что есть сильно напряжно...
rsa вне форума   Ответить с цитированием
Старый 13.07.2010, 08:59   #3
virusav
Администратор
 
Аватар для virusav
 
Регистрация: 19.02.2010
Сообщений: 492
Сказал(а) спасибо: 55
Поблагодарили 341 раз(а) в 154 сообщениях
virusav Реально хороший человекvirusav Реально хороший человекvirusav Реально хороший человекvirusav Реально хороший человек
Отправить сообщение для virusav с помощью ICQ
По умолчанию

На СД2 я написал патч, текст берется из базы, как и во всех подобных случаях.
Получилось, что патч нужен только для произнесения одной из 3 фраз и состоит фактически из одной строки кода.
Не знаю, стоит ли из-за одной строки городить скрипт СД2 или лучше ее прописать в ядро.

Если бы можно было реализовать это в ядре, то все работало бы, как часы.

Допустим, что надо делать через СД2.
Произнесение фразы - это эффект от спелла.

Через скрипт на итем нет ожидания каста спелла, поэтому сначала игрок кричит фразу, а потом уже идет каст.
Как на СД2 сделать, чтобы код отрабатывал при касте спелла, как если бы код был написан в ядре в соответствующем обработчике?
virusav вне форума   Ответить с цитированием
Старый 13.07.2010, 10:58   #4
LordJZ
Супер-модератор
 
Аватар для LordJZ
 
Регистрация: 07.03.2010
Сообщений: 647
Сказал(а) спасибо: 100
Поблагодарили 252 раз(а) в 123 сообщениях
LordJZ Как самоцвет среди гранитаLordJZ Как самоцвет среди гранитаLordJZ Как самоцвет среди гранита
По умолчанию

Давно имхо уже пора удалить все Creature::Say/Yell/... и Player::Say/Yell/.. и использовать вместо этого Unit. Ведь разговор НПС от разговора игрока ничем не отличается, кроме обычно используемых типов. По наблюдениям с офа могу сказать, что в квестах, где игрок разговаривает, подчиняясь серверным командам, используются как стандартные плееровские CHAT_MSG_SAY, так и присущие кричерам CHAT_MSG_MONSTER_SAY.
LordJZ вне форума   Ответить с цитированием
Старый 13.07.2010, 13:46   #5
virusav
Администратор
 
Аватар для virusav
 
Регистрация: 19.02.2010
Сообщений: 492
Сказал(а) спасибо: 55
Поблагодарили 341 раз(а) в 154 сообщениях
virusav Реально хороший человекvirusav Реально хороший человекvirusav Реально хороший человекvirusav Реально хороший человек
Отправить сообщение для virusav с помощью ICQ
По умолчанию

Цитата:
Сообщение от LordJZ Посмотреть сообщение
Давно имхо уже пора удалить все Creature::Say/Yell/... и Player::Say/Yell/.. и использовать вместо этого Unit. Ведь разговор НПС от разговора игрока ничем не отличается, кроме обычно используемых типов. По наблюдениям с офа могу сказать, что в квестах, где игрок разговаривает, подчиняясь серверным командам, используются как стандартные плееровские CHAT_MSG_SAY, так и присущие кричерам CHAT_MSG_MONSTER_SAY.
Как реализовать выкрик случайной фразы в СД2 или ядре, чтобы не потерять локализацию (проблемы описаны постами выше)?
virusav вне форума   Ответить с цитированием
Старый 13.07.2010, 14:33   #6
LordJZ
Супер-модератор
 
Аватар для LordJZ
 
Регистрация: 07.03.2010
Сообщений: 647
Сказал(а) спасибо: 100
Поблагодарили 252 раз(а) в 123 сообщениях
LordJZ Как самоцвет среди гранитаLordJZ Как самоцвет среди гранитаLordJZ Как самоцвет среди гранита
По умолчанию

Насколько я помню, из SD2 доступен вызов sObjectMgr.GetMangosString(...), через него можно, я так думаю.
LordJZ вне форума   Ответить с цитированием
Старый 13.07.2010, 15:14   #7
virusav
Администратор
 
Аватар для virusav
 
Регистрация: 19.02.2010
Сообщений: 492
Сказал(а) спасибо: 55
Поблагодарили 341 раз(а) в 154 сообщениях
virusav Реально хороший человекvirusav Реально хороший человекvirusav Реально хороший человекvirusav Реально хороший человек
Отправить сообщение для virusav с помощью ICQ
По умолчанию

В СД2 есть функция произнесения фраз по кодам из `script_texts`, я ее и использую.
Только скрипт на итем отрабатывает при его использовании, а не при касте спелла итема.

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

Если только в `spell_scripts` добавить возможность указания гурппы текстов, из которых случайным образом выбирается один.

Нужно произносить фразу в момент каста спелла, а не использования итема.
virusav вне форума   Ответить с цитированием
Старый 13.07.2010, 15:25   #8
KiriX
Умный
Старожил
 
Аватар для KiriX
 
Регистрация: 06.03.2010
Сообщений: 886
Сказал(а) спасибо: 698
Поблагодарили 433 раз(а) в 181 сообщениях
Записей в дневнике: 4
KiriX Реально хороший человекKiriX Реально хороший человекKiriX Реально хороший человекKiriX Реально хороший человекKiriX Реально хороший человек
По умолчанию

Цитата:
Сообщение от virusav Посмотреть сообщение
В СД2 есть функция произнесения фраз по кодам из `script_texts`, я ее и использую.
Только скрипт на итем отрабатывает при его использовании, а не при касте спелла итема.

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

Если только в `spell_scripts` добавить возможность указания гурппы текстов, из которых случайным образом выбирается один.

Нужно произносить фразу в момент каста спелла, а не использования итема.
Указание группы фраз в `spell_scripts` мягко говоря нецелесообразно...
Может просто использовать скрипт юза итема с задержкой...
KiriX вне форума   Ответить с цитированием
Старый 13.07.2010, 15:55   #9
virusav
Администратор
 
Аватар для virusav
 
Регистрация: 19.02.2010
Сообщений: 492
Сказал(а) спасибо: 55
Поблагодарили 341 раз(а) в 154 сообщениях
virusav Реально хороший человекvirusav Реально хороший человекvirusav Реально хороший человекvirusav Реально хороший человек
Отправить сообщение для virusav с помощью ICQ
По умолчанию

Задержка должна равняться времени применении спелла.
По идее, должен быть какой-то общий обработчик.

Как сделать задержку в СД2 на выполнение при использовании итема с учетом того, что каст может быть не выполнен при использовании итема?
virusav вне форума   Ответить с цитированием
Старый 13.07.2010, 16:03   #10
LordJZ
Супер-модератор
 
Аватар для LordJZ
 
Регистрация: 07.03.2010
Сообщений: 647
Сказал(а) спасибо: 100
Поблагодарили 252 раз(а) в 123 сообщениях
LordJZ Как самоцвет среди гранитаLordJZ Как самоцвет среди гранитаLordJZ Как самоцвет среди гранита
По умолчанию

virusav, я же вам еще про квесты в Нордсколе рассказывал... ну есть же функция AI::SpellHit — через нее и делайте.
LordJZ вне форума   Ответить с цитированием
Старый 13.07.2010, 16:42   #11
virusav
Администратор
 
Аватар для virusav
 
Регистрация: 19.02.2010
Сообщений: 492
Сказал(а) спасибо: 55
Поблагодарили 341 раз(а) в 154 сообщениях
virusav Реально хороший человекvirusav Реально хороший человекvirusav Реально хороший человекvirusav Реально хороший человек
Отправить сообщение для virusav с помощью ICQ
По умолчанию

В СД2 на игрока навесить произнесение фразы при касте на него спелла?
virusav вне форума   Ответить с цитированием
Старый 13.07.2010, 19:39   #12
LordJZ
Супер-модератор
 
Аватар для LordJZ
 
Регистрация: 07.03.2010
Сообщений: 647
Сказал(а) спасибо: 100
Поблагодарили 252 раз(а) в 123 сообщениях
LordJZ Как самоцвет среди гранитаLordJZ Как самоцвет среди гранитаLordJZ Как самоцвет среди гранита
По умолчанию

Если на игрока — тогда через ядро.
LordJZ вне форума   Ответить с цитированием
Старый 13.07.2010, 19:53   #13
virusav
Администратор
 
Аватар для virusav
 
Регистрация: 19.02.2010
Сообщений: 492
Сказал(а) спасибо: 55
Поблагодарили 341 раз(а) в 154 сообщениях
virusav Реально хороший человекvirusav Реально хороший человекvirusav Реально хороший человекvirusav Реально хороший человек
Отправить сообщение для virusav с помощью ICQ
По умолчанию

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

На СД2 как-нибудь можно реализовать, чтобы работало, как полагается?
virusav вне форума   Ответить с цитированием
Старый 13.07.2010, 20:14   #14
rsa
Почетный флудер
Старожил
 
Аватар для rsa
 
Регистрация: 08.03.2010
Адрес: Мурманск, Россия
Сообщений: 788
Сказал(а) спасибо: 55
Поблагодарили 333 раз(а) в 151 сообщениях
Записей в дневнике: 1
rsa Как самоцвет среди гранитаrsa Как самоцвет среди гранитаrsa Как самоцвет среди гранитаrsa Как самоцвет среди гранита
По умолчанию

Цитата:
Сообщение от virusav Посмотреть сообщение
Как на СД2 сделать, чтобы код отрабатывал при касте спелла, как если бы код был написан в ядре в соответствующем обработчике?
В принципе способов куча, но единственный без серьезных граблей - ждать в UpdateAI()
!pCaster->IsNonMeleeSpellCasted(false)

все остальные это просто минное поле какое-то
rsa вне форума   Ответить с цитированием
Старый 13.07.2010, 20:17   #15
virusav
Администратор
 
Аватар для virusav
 
Регистрация: 19.02.2010
Сообщений: 492
Сказал(а) спасибо: 55
Поблагодарили 341 раз(а) в 154 сообщениях
virusav Реально хороший человекvirusav Реально хороший человекvirusav Реально хороший человекvirusav Реально хороший человек
Отправить сообщение для virusav с помощью ICQ
По умолчанию

UpdateAI() для игрока?
virusav вне форума   Ответить с цитированием
Старый 13.07.2010, 20:23   #16
rsa
Почетный флудер
Старожил
 
Аватар для rsa
 
Регистрация: 08.03.2010
Адрес: Мурманск, Россия
Сообщений: 788
Сказал(а) спасибо: 55
Поблагодарили 333 раз(а) в 151 сообщениях
Записей в дневнике: 1
rsa Как самоцвет среди гранитаrsa Как самоцвет среди гранитаrsa Как самоцвет среди гранитаrsa Как самоцвет среди гранита
По умолчанию

Цитата:
Сообщение от virusav Посмотреть сообщение
UpdateAI() для игрока?
Нет. Для фейк-моба который будет рулить всем процессом.
rsa вне форума   Ответить с цитированием
Старый 13.07.2010, 20:51   #17
virusav
Администратор
 
Аватар для virusav
 
Регистрация: 19.02.2010
Сообщений: 492
Сказал(а) спасибо: 55
Поблагодарили 341 раз(а) в 154 сообщениях
virusav Реально хороший человекvirusav Реально хороший человекvirusav Реально хороший человекvirusav Реально хороший человек
Отправить сообщение для virusav с помощью ICQ
По умолчанию

Не осилил.
Игрок может использовать итем в любой точке, после чего на него накладывается спелл.
Что за фейк-моб?
virusav вне форума   Ответить с цитированием
Старый 14.07.2010, 06:55   #18
MaS0n
Модератор
 
Регистрация: 09.03.2010
Адрес: dev/null
Сообщений: 126
Сказал(а) спасибо: 44
Поблагодарили 111 раз(а) в 47 сообщениях
MaS0n Скоро придёт к известностиMaS0n Скоро придёт к известности
Отправить сообщение для MaS0n с помощью ICQ
По умолчанию

Цитата:
Сообщение от KiriX Посмотреть сообщение
Может просто использовать скрипт юза итема с задержкой...
Нельзя, если не добавлять совершенно другой функционал для юза итема. Сейчас эта функция вызывается в
Код:
void WorldSession::HandleUseItemOpcode(WorldPacket& recvPacket)
Никаких задержек здесь сделать невозможно

Цитата:
Сообщение от virusav Посмотреть сообщение
Не осилил.
Игрок может использовать итем в любой точке, после чего на него накладывается спелл.
Что за фейк-моб?
Контроллер, например вызываемый при касте(скрипт юза итема собсно) - далее раз игрок юзает итем, он кастует спелл, значит в апдейтАИ контроллера можно это отслеживать, как предлагает rsa - и как только это состояние кончится - кастануть нужный спелл и обработать тексты

А вообще, пришла в голову только мысль добавить для EFFECT_SCRIPT_EFFECT такую же обработку как и для dummy, хотя по идее сложный скрипт-эффекты обрабатываются в ядре, более простые - в БД, но мб этот вариант уже назрел

Как это для dummy
Код:
void Spell::EffectDummy(SpellEffectIndex eff_idx)
обьект Script есть стандартная часть кода и связан с вызовом скриптов в ScriptCalls.cpp, т.е дополнительно какой-то гемор с обьявлениями не будет
Вот так в конце кода обработки dummy-эффектов
Код:
    // Script based implementation. Must be used only for not good for implementation in core spell effects
    // So called only for not processed cases
    if (gameObjTarget)
        Script->EffectDummyGameObj(m_caster, m_spellInfo->Id, eff_idx, gameObjTarget);
    else if (unitTarget && unitTarget->GetTypeId()==TYPEID_UNIT)
        Script->EffectDummyCreature(m_caster, m_spellInfo->Id, eff_idx, (Creature*)unitTarget);
    else if (itemTarget)
        Script->EffectDummyItem(m_caster, m_spellInfo->Id, eff_idx, itemTarget);
MaS0n вне форума   Ответить с цитированием
Старый 14.07.2010, 09:05   #19
virusav
Администратор
 
Аватар для virusav
 
Регистрация: 19.02.2010
Сообщений: 492
Сказал(а) спасибо: 55
Поблагодарили 341 раз(а) в 154 сообщениях
virusav Реально хороший человекvirusav Реально хороший человекvirusav Реально хороший человекvirusav Реально хороший человек
Отправить сообщение для virusav с помощью ICQ
По умолчанию

Примеров с EffectDummyItem в СД2 не видел.
У итема как раз спелл с таким эффектом, попробую через него.
virusav вне форума   Ответить с цитированием
Старый 15.07.2010, 21:26   #20
virusav
Администратор
 
Аватар для virusav
 
Регистрация: 19.02.2010
Сообщений: 492
Сказал(а) спасибо: 55
Поблагодарили 341 раз(а) в 154 сообщениях
virusav Реально хороший человекvirusav Реально хороший человекvirusav Реально хороший человекvirusav Реально хороший человек
Отправить сообщение для virusav с помощью ICQ
По умолчанию

Попробовал сделать так:
Код:
static uint32 m_YellTexts[] = {-1000006, -1000007, -1000008};

enum
{
    // quest 11989
    SPELL_BLOOD_OATH                    = 50141,
    SPELL_BLOOD_OATH_AURA               = 50001
};

bool EffectDummyItem_spell_dummy_item(Unit* pCaster, uint32 uiSpellId, SpellEffectIndex uiEffIndex, Item *pItemTarget)
{
    switch(uiSpellId)
    {
        case SPELL_BLOOD_OATH:
        {
            if (uiEffIndex == EFFECT_INDEX_0)
            {
                pCaster->CastSpell(pCaster, SPELL_BLOOD_OATH_AURA, true);
                DoScriptText(m_YellTexts[urand(0, 2)], pCaster);
                return true;
            }
        }
    }
    return false;
}
...
    newscript = new Script;
    newscript->Name = "spell_dummy_item";
    newscript->pEffectDummyItem = &EffectDummyItem_spell_dummy_item;
    newscript->RegisterSelf();
Назначил итему скрипт spell_dummy_item, но при использовании итема ничего не произошло.

В чем может быть проблема?
virusav вне форума   Ответить с цитированием
Старый 16.07.2010, 17:03   #21
MaS0n
Модератор
 
Регистрация: 09.03.2010
Адрес: dev/null
Сообщений: 126
Сказал(а) спасибо: 44
Поблагодарили 111 раз(а) в 47 сообщениях
MaS0n Скоро придёт к известностиMaS0n Скоро придёт к известности
Отправить сообщение для MaS0n с помощью ICQ
По умолчанию

То, что вы собираетесь наложить - является dummy аурой, а не dummy эффектом, но даже если б это был эффект - использование сего метода скрипта требует itemTarget - коим каст с квест-итема не является

Обработка dummy ауры выглядит вот так
Код:
    // script has to "handle with care", only use where data are not ok to use in the above code.
    if (m_target->GetTypeId() == TYPEID_UNIT)
        Script->EffectAuraDummy(this, apply);
Причем как видно - это только если цель ауры - тип Unit, а у нас аура имеет TARGET_SELF и должна ложится на плеера, так что это условие игнорится

Как вариант - разрешить выполнение скрипта ауры всегда, но вести проверку типов целей в самих скриптах спеллов, как пример :
Код:
bool EffectAuraDummy_spell_aura_dummy_npc(const Aura* pAura, bool bApply)
{
    switch(pAura->GetId())
    {
        case SPELL_HEALING_SALVE:
        {
            if (pAura->GetEffIndex() != EFFECT_INDEX_0)
                return true;

            if (bApply)
            {
                if (Unit* pCaster = pAura->GetCaster())
                    pCaster->CastSpell(pAura->GetTarget(), SPELL_HEALING_SALVE_DUMMY, true);
            }

            return true;
        }
добавить что-то вроде
Код:
                if (Unit* pCaster = pAura->GetCaster())
                  if (pAura->GetTarget()->GetTypeID() == TYPEID_UNIT)
                    pCaster->CastSpell(pAura->GetTarget(), SPELL_HEALING_SALVE_DUMMY, true);
Мб конечно это и неправильно, но по-моему других вариантов обработать каст в СД2 чтоб игрок мог сказать текст - нету
MaS0n вне форума   Ответить с цитированием
Старый 16.07.2010, 17:08   #22
virusav
Администратор
 
Аватар для virusav
 
Регистрация: 19.02.2010
Сообщений: 492
Сказал(а) спасибо: 55
Поблагодарили 341 раз(а) в 154 сообщениях
virusav Реально хороший человекvirusav Реально хороший человекvirusav Реально хороший человекvirusav Реально хороший человек
Отправить сообщение для virusav с помощью ICQ
По умолчанию

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

да, я ток сейчас соообразил, что ограничение из-за того, что мы используем скрипт моба, который является m_target для dummy ауры

Ну тогда скорей всего надо дописывать какой-то новый фукционал, связанный с расширенными скриптами на итемы
MaS0n вне форума   Ответить с цитированием
Ответ


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

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



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


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