Ru-MaNGOS

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

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

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

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

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

Код:
Unit* target = GetTarget();
if(target->GetTypeId() == TYPEID_PLAYER)
{
    Player* player = (Player*)target;
    player->GetTalents(player->GetActiveSpec());
}
При необходимости реализовать GetTalents
LordJZ вне форума   Ответить с цитированием
Старый 14.06.2010, 14:23   #3
virusav
Администратор
 
Аватар для virusav
 
Регистрация: 19.02.2010
Сообщений: 492
Сказал(а) спасибо: 55
Поблагодарили 341 раз(а) в 154 сообщениях
virusav Реально хороший человекvirusav Реально хороший человекvirusav Реально хороший человекvirusav Реально хороший человек
Отправить сообщение для virusav с помощью ICQ
По умолчанию

В исходниках нигде не нашел данной функции.
Код:
 >..\..\src\game\SpellAuras.cpp(5327) : error C2039: 'GetTalents' : is not a member of 'Player'
virusav вне форума   Ответить с цитированием
Старый 14.06.2010, 14:39   #4
LordJZ
Супер-модератор
 
Аватар для LordJZ
 
Регистрация: 07.03.2010
Сообщений: 647
Сказал(а) спасибо: 100
Поблагодарили 252 раз(а) в 123 сообщениях
LordJZ Как самоцвет среди гранитаLordJZ Как самоцвет среди гранитаLordJZ Как самоцвет среди гранита
По умолчанию

Поэтому я и написал
Цитата:
Сообщение от LordJZ Посмотреть сообщение
При необходимости реализовать GetTalents
В функции возвращать m_talents
LordJZ вне форума   Ответить с цитированием
Старый 14.06.2010, 14:48   #5
virusav
Администратор
 
Аватар для virusav
 
Регистрация: 19.02.2010
Сообщений: 492
Сказал(а) спасибо: 55
Поблагодарили 341 раз(а) в 154 сообщениях
virusav Реально хороший человекvirusav Реально хороший человекvirusav Реально хороший человекvirusav Реально хороший человек
Отправить сообщение для virusav с помощью ICQ
По умолчанию

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

Допустим, что есть 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   #7
virusav
Администратор
 
Аватар для virusav
 
Регистрация: 19.02.2010
Сообщений: 492
Сказал(а) спасибо: 55
Поблагодарили 341 раз(а) в 154 сообщениях
virusav Реально хороший человекvirusav Реально хороший человекvirusav Реально хороший человекvirusav Реально хороший человек
Отправить сообщение для virusav с помощью ICQ
По умолчанию

Код:
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'
virusav вне форума   Ответить с цитированием
Старый 14.06.2010, 20:58   #8
LordJZ
Супер-модератор
 
Аватар для LordJZ
 
Регистрация: 07.03.2010
Сообщений: 647
Сказал(а) спасибо: 100
Поблагодарили 252 раз(а) в 123 сообщениях
LordJZ Как самоцвет среди гранитаLordJZ Как самоцвет среди гранитаLordJZ Как самоцвет среди гранита
По умолчанию

Переместите GetTalents из protected: в public:
LordJZ вне форума   Ответить с цитированием
Старый 14.06.2010, 21:56   #9
virusav
Администратор
 
Аватар для virusav
 
Регистрация: 19.02.2010
Сообщений: 492
Сказал(а) спасибо: 55
Поблагодарили 341 раз(а) в 154 сообщениях
virusav Реально хороший человекvirusav Реально хороший человекvirusav Реально хороший человекvirusav Реально хороший человек
Отправить сообщение для virusav с помощью ICQ
По умолчанию

Переместил, теперь в 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
Никак не пойму, как типы привести один к другому.
virusav вне форума   Ответить с цитированием
Старый 14.06.2010, 22:01   #10
KiriX
Умный
Старожил
 
Аватар для KiriX
 
Регистрация: 06.03.2010
Сообщений: 886
Сказал(а) спасибо: 698
Поблагодарили 433 раз(а) в 181 сообщениях
Записей в дневнике: 4
KiriX Реально хороший человекKiriX Реально хороший человекKiriX Реально хороший человекKiriX Реально хороший человекKiriX Реально хороший человек
По умолчанию

Зачем получать талант вообще? Может проще найти ауру от таланта?
KiriX вне форума   Ответить с цитированием
Старый 14.06.2010, 22:27   #11
virusav
Администратор
 
Аватар для virusav
 
Регистрация: 19.02.2010
Сообщений: 492
Сказал(а) спасибо: 55
Поблагодарили 341 раз(а) в 154 сообщениях
virusav Реально хороший человекvirusav Реально хороший человекvirusav Реально хороший человекvirusav Реально хороший человек
Отправить сообщение для virusav с помощью ICQ
По умолчанию

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

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

А HasTalent уже нету?

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

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

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

Загвоздка в получении таланта или их списка, остальное можно извлечь из таланта.
virusav вне форума   Ответить с цитированием
Старый 14.06.2010, 23:43   #14
LordJZ
Супер-модератор
 
Аватар для LordJZ
 
Регистрация: 07.03.2010
Сообщений: 647
Сказал(а) спасибо: 100
Поблагодарили 252 раз(а) в 123 сообщениях
LordJZ Как самоцвет среди гранитаLordJZ Как самоцвет среди гранитаLordJZ Как самоцвет среди гранита
По умолчанию

Талант по номеру из DBC? А откуда он у вас и зачем?
LordJZ вне форума   Ответить с цитированием
Старый 15.06.2010, 08:59   #15
virusav
Администратор
 
Аватар для virusav
 
Регистрация: 19.02.2010
Сообщений: 492
Сказал(а) спасибо: 55
Поблагодарили 341 раз(а) в 154 сообщениях
virusav Реально хороший человекvirusav Реально хороший человекvirusav Реально хороший человекvirusav Реально хороший человек
Отправить сообщение для virusav с помощью ICQ
По умолчанию

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

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

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

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

Запутано что-то с указателями при обращении к 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]; }
MaS0n вне форума   Ответить с цитированием
Старый 15.06.2010, 15:36   #17
TOM_RUS
MaNGOS Dev
 
Регистрация: 11.03.2010
Сообщений: 468
Сказал(а) спасибо: 0
Поблагодарили 514 раз(а) в 163 сообщениях
TOM_RUS Как свет с небесTOM_RUS Как свет с небесTOM_RUS Как свет с небесTOM_RUS Как свет с небесTOM_RUS Как свет с небесTOM_RUS Как свет с небес
По умолчанию

Функция получения таланта по его id был добавлена сегодня в одном из коммитов.
TOM_RUS вне форума   Ответить с цитированием
Старый 15.06.2010, 20:20   #18
virusav
Администратор
 
Аватар для virusav
 
Регистрация: 19.02.2010
Сообщений: 492
Сказал(а) спасибо: 55
Поблагодарили 341 раз(а) в 154 сообщениях
virusav Реально хороший человекvirusav Реально хороший человекvirusav Реально хороший человекvirusav Реально хороший человек
Отправить сообщение для virusav с помощью ICQ
По умолчанию

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

После того коммита можно найти сразу спелл, но
Код:
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   #20
virusav
Администратор
 
Аватар для virusav
 
Регистрация: 19.02.2010
Сообщений: 492
Сказал(а) спасибо: 55
Поблагодарили 341 раз(а) в 154 сообщениях
virusav Реально хороший человекvirusav Реально хороший человекvirusav Реально хороший человекvirusav Реально хороший человек
Отправить сообщение для virusav с помощью ICQ
По умолчанию

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


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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Получение данных Карта->Зона Hantet WWW 9 11.09.2010 22:21


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


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