PDA

Просмотр полной версии : Получение таланта


virusav
14.06.2010, 12:31
В 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 и т.д.) были доступны через точку, как внутри класса?

LordJZ
14.06.2010, 12:39
Unit* target = GetTarget();
if(target->GetTypeId() == TYPEID_PLAYER)
{
Player* player = (Player*)target;
player->GetTalents(player->GetActiveSpec());
}При необходимости реализовать GetTalents

virusav
14.06.2010, 14:23
В исходниках нигде не нашел данной функции.
>..\..\src\game\SpellAuras.cpp(5327) : error C2039: 'GetTalents' : is not a member of 'Player'

LordJZ
14.06.2010, 14:39
Поэтому я и написалПри необходимости реализовать GetTalentsВ функции возвращать m_talents

virusav
14.06.2010, 14:48
Это понятно.
Просто не нашел функции и полез на форум.:)

virusav
14.06.2010, 19:29
Допустим, что есть 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);

Что должно быть вместо выделенного красным, чтобы можно было дальше работать с объектами?

virusav
14.06.2010, 19:46
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'

LordJZ
14.06.2010, 20:58
Переместите GetTalents из protected: в public:

virusav
14.06.2010, 21:56
Переместил, теперь в 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

Никак не пойму, как типы привести один к другому.

KiriX
14.06.2010, 22:01
Зачем получать талант вообще? Может проще найти ауру от таланта?

virusav
14.06.2010, 22:27
Это для правки патча http://ru-mangos.ru/showthread.php?t=1445
В теме выложил первый вариант, получил замечания, по которым теперь планирую внести правки.

Среди замечаний была замена HasSpell на работу через талант.
Для этих целей и ищу талант, чтобы из него получить спелл и значение эффекта.

LordJZ
14.06.2010, 23:21
А HasTalent уже нету?

Edit: Вижу нет, жаль...
Должен работать поиск по ауре HasAura

virusav
14.06.2010, 23:24
Поиск по исходникам сказал, что нет.
Мне надо получить талант по номеру, взять его спелл, а у спелла значение эффекта.

Загвоздка в получении таланта или их списка, остальное можно извлечь из таланта.

LordJZ
14.06.2010, 23:43
Талант по номеру из DBC? А откуда он у вас и зачем?

virusav
15.06.2010, 08:59
Добавил кусок кода для печати номера таланта в лог, оттуда и взял.
Зачем - ответ в посте 11.

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

Схема такова: берем талант, значение эффекта спелла и увеличиваем бонус на это значение.

На текущий момент не нашел функций поиска талантов вне Player.p, поэтому пробую сделать сам, но знаний не хватает.

MaS0n
15.06.2010, 09:39
Запутано что-то с указателями при обращении к 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]; }

TOM_RUS
15.06.2010, 15:36
Функция получения таланта по его id был добавлена сегодня в одном из коммитов.

virusav
15.06.2010, 20:20
Спасибо за хорошую новость, а автору коммита за проделанную работу (за коммитами слежу, но вечером :)).

virusav
15.06.2010, 20:48
После того коммита можно найти сразу спелл, но
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, следуя комментарию?

virusav
15.06.2010, 21:36
Не туда посмотрел, все оказалось намного проще, нашел опять же в комментах:
int32 m_currentBasePoints[MAX_EFFECT_INDEX]; // cache SpellEntry::CalculateSimpleValue and use for set custom base points