Просмотр полной версии : Получение таланта
В Player.cpp есть
PlayerTalentMap::iterator iter = m_talents[m_activeSpec].find(talentPos->talent_id);
Необходимо получить талант в SpellAuras.cpp.
Есть Unit *target = GetTarget();
Как я понимаю, нужен объект Player.
Допустим, что есть pPlayer.
PlayerTalentMap::iterator iter = pPlayer.m_talents[pPlayer->GetActiveSpec()].find(xxx);
В данном случае вылетает ошибка, т.к. m_talents отсутствует, а метода его получения я не нашел.
1. Каким образом можно получить талант игрока?
2. Допустима ли конструкция Player* pPlayer = (Player*)target;?
3. Можно ли как-нибудь определить объект Player, чтобы все его переменные (m_talents, m_activeSpec и т.д.) были доступны через точку, как внутри класса?
Unit* target = GetTarget();
if(target->GetTypeId() == TYPEID_PLAYER)
{
Player* player = (Player*)target;
player->GetTalents(player->GetActiveSpec());
}При необходимости реализовать GetTalents
В исходниках нигде не нашел данной функции.
>..\..\src\game\SpellAuras.cpp(5327) : error C2039: 'GetTalents' : is not a member of 'Player'
Поэтому я и написалПри необходимости реализовать GetTalentsВ функции возвращать m_talents
Это понятно.
Просто не нашел функции и полез на форум.:)
Допустим, что есть 2 функции:
PlayerTalentMap GetTalents(uint8 spec) { return m_talents[spec]; }
PlayerTalentMap::iterator GetTalent(uint8 spec, uint32 talent_id) { return m_talents[spec].find(talent_id); }
Надо как-то обратитьтся к ним и получить объекты:
Player* player = (Player*)target;
PlayerTalentMap* talents = player->GetTalents(player->GetActiveSpec());
PlayerTalent* talent = player->GetTalent(player->GetActiveSpec(), xxx);
Что должно быть вместо выделенного красным, чтобы можно было дальше работать с объектами?
PlayerTalentMap::iterator iter = player->GetTalents(player->GetActiveSpec()).find(xxx);
2>..\..\src\game\SpellAuras.cpp(5358) : error C2248: 'Player::GetTalents' : cannot access protected member declared in class 'Player'
2> f:\_system\src\wow\mangos\master\src\game\Player.h (2486) : see declaration of 'Player::GetTalents'
2> f:\_system\src\wow\mangos\master\src\game\Player.h (1076) : see declaration of 'Player'
Переместите GetTalents из protected: в public:
Переместил, теперь в Player.h:
public
...
// Dual Spec
PlayerTalentMap GetTalents(uint8 spec) { return m_talents[spec]; }
В SpellAuras.cpp:
Player* player = (Player*)target;
PlayerTalentMap* talents = player->GetTalents(player->GetActiveSpec());
Ошибка компиляции:
2>SpellAuras.cpp
2>..\..\src\game\SpellAuras.cpp(5358) : error C2440: 'initializing' : cannot convert from 'PlayerTalentMap' to 'PlayerTalentMap *'
2> No user-defined-conversion operator available that can perform this conversion, or the operator cannot be called
Никак не пойму, как типы привести один к другому.
Зачем получать талант вообще? Может проще найти ауру от таланта?
Это для правки патча http://ru-mangos.ru/showthread.php?t=1445
В теме выложил первый вариант, получил замечания, по которым теперь планирую внести правки.
Среди замечаний была замена HasSpell на работу через талант.
Для этих целей и ищу талант, чтобы из него получить спелл и значение эффекта.
А HasTalent уже нету?
Edit: Вижу нет, жаль...
Должен работать поиск по ауре HasAura
Поиск по исходникам сказал, что нет.
Мне надо получить талант по номеру, взять его спелл, а у спелла значение эффекта.
Загвоздка в получении таланта или их списка, остальное можно извлечь из таланта.
Талант по номеру из DBC? А откуда он у вас и зачем?
Добавил кусок кода для печати номера таланта в лог, оттуда и взял.
Зачем - ответ в посте 11.
Поясню: в патче писал расчет бонуса в цикле в зависимости от таланта, в замечании мне посоветовали брать данные из спелла, с чем я согласен.
Массив будет не нужен, если получить талант.
Схема такова: берем талант, значение эффекта спелла и увеличиваем бонус на это значение.
На текущий момент не нашел функций поиска талантов вне Player.p, поэтому пробую сделать сам, но знаний не хватает.
Запутано что-то с указателями при обращении к GetTalents(). рассмотрите для примера
AuraList const& GetAurasByType(AuraType type) const { return m_modAuras[type]; }
AuraMap & GetAuras() { return m_Auras; }
AuraList const& ModPowerRegenPCTAuras = GetAurasByType(SPELL_AURA_MOD_POWER_REGEN_PERCENT) ;
AuraMap const& auras = GetAuras();
примерно так попрбуйте
PlayerTalentMap& GetTalents(uint8 spec) { return m_talents[spec]; }
или с указателем
PlayerTalentMap * GetTalents(uint8 spec) { return &m_talents[spec]; }
Функция получения таланта по его id был добавлена сегодня в одном из коммитов.
Спасибо за хорошую новость, а автору коммита за проделанную работу (за коммитами слежу, но вечером :)).
После того коммита можно найти сразу спелл, но
SpellEntry const* spell = player->GetKnownTalentRankById(xxx);
содержит EffectBasePoints, про которые написано
(don't must be used in spell/auras explicitly, must be used cached Spell::m_currentBasePoints)
Лучше брать спелл
Spell* spell = sSpellStore.LookupEntry(xxx);
и из него доставать m_currentBasePoints, следуя комментарию?
Не туда посмотрел, все оказалось намного проще, нашел опять же в комментах:
int32 m_currentBasePoints[MAX_EFFECT_INDEX]; // cache SpellEntry::CalculateSimpleValue and use for set custom base points
vBulletin® v3.8.4, Copyright ©2000-2024, Jelsoft Enterprises Ltd. Перевод: zCarot