|
|
Модератор форума: Dimitro |
Форум TrinityCore [TrinityCore] Help OnPvPKill ([C++]) |
OnPvPKill |
В ScriptMgr.h есть функция:
OnPvPKill, если писать скрипт, то те кто в пати или рейде, не получат награды. Только тот кто убил, как это исправить? Чтобы к примеру хиллы или тот, кто помогал убивать, тоже получили награду. Без кода в Player.cpp, нужно написать отдельный скрипт. Заранее благодарю, мне не нужно писать за меня скрипт и т.д., просто укажите куда копать? То как реализовать это в Player.cpp, я знаю, как реализовать в отдельном скрипте, хз.
[blizz]Судить меня дано лишь богу, другим я укажу дорогу
[/blizz]
Сообщение # 1 написано 19.01.2016 в 16:34
|
На Battleground'ах почетные победы на моей ревизии (то, что Вы, очевидно, хотите реализовать) выдаются так:
Код for (BattlegroundPlayerMap::const_iterator itr = m_Players.begin(); itr != m_Players.end(); ++itr) { Player* creditedPlayer = ObjectAccessor::FindPlayer(itr->first); if (!creditedPlayer || creditedPlayer == killer) continue; if (creditedPlayer->GetTeam() == killer->GetTeam() && creditedPlayer->IsAtGroupRewardDistance(victim)) UpdatePlayerScore(creditedPlayer, SCORE_HONORABLE_KILLS, 1); } Можете по аналогии сделать для всего мира (итерирование по группе убившего (если таковая имеется)), проверка на нахождение итератора (игрока) в определенном радиусе. Если дистанция устраивает -> выдавать награду. Для этого достаточно будет подрубиться к PlayerScript::OnPVPKill(Player*, Player*). Если же необходима более сложная система (с отслеживанием игроков, нанесших урон жертве или воздействовавших на убийцу положительным эффектом за время боя), то от реализации в Player (и не только, скорее всего) никуда не уйти. В частности, одной из возможностей отследить участвовавших в убийстве (нанесших урон жертве за бой) будет Unit::getAttackers(), который возвращает Unit::AttackerSet&, который, в свою очередь, чистится до того, как успевает отработать вышеупомянутый хук внутри Unit::Kill(Unit*, bool). |
p620, это уже совсем кругами пошёл, ибо в Player.cpp - это реализовано:
Вопрос в другом, всё это в Player.cpp, как реализовать это в отдельном скрипте. Пробовал подрубать Player.h Тогда у меня ругается на: if (_group) И т.д.
[blizz]Судить меня дано лишь богу, другим я укажу дорогу
[/blizz] |
Перед описанием класса там огромный комментарий, объясняющий, зачем он нужен и чем награждает.
Если Вас все устраивает, то и править ничего не нужно, ибо он отрабатывает при любом убийстве, совершенном игроком. В противном случае опишите подробнее, чем Вы хотите награждать игроков, для получения более конкретных советов.
Сообщение # 4 написано 19.01.2016 в 22:43
|
p620, я описал, что мне нужно в отдельном скрипте это реализовать.
Перед описанием класса там огромный комментарий, объясняющий, зачем он нужен и чем награждает. Я уже в самом первом посте и во 2ом своём посте, говорил, что я знаю, как реализовать в Player.cpp, мне нужно отдельно. Как вынести всё это отдельно?? В отдельный скрипт.
[blizz]Судить меня дано лишь богу, другим я укажу дорогу
[/blizz]
Сообщение # 5 написано 19.01.2016 в 22:51
|
Проклятье, этот форум меня убивает. В общем, я составил цепочку цитат, которая явно демонстрирует Ваше хождение по кругу, форум все похерил, переделывать не буду, ибо не в первый раз за сегодня уже этим занимаюсь, напишу только вывод:
Перечитайте еще раз мой первый пост (первую часть, про подрубание к хуку). Если вопрос останется - сформулируйте его точнее и конкретнее, без "это", ссылок на какие-то другие посты/цитаты/etc. Тогда получите нормальный ответ. |
Перед описанием класса там огромный комментарий, объясняющий, зачем он нужен и чем награждает.Если Вас все устраивает, то и править ничего не нужно, ибо он отрабатывает при любом убийстве, совершенном игроком. В противном случае опишите подробнее, чем Вы хотите награждать игроков, для получения более конкретных советов. Скажу, что меня не устраивает, но и править в самом Player.cpp мне не нужно! Мне нужно в отдельном патче. Так понятно?? Не важно чем я его хочу наградить, итемом или хонором, мне нужно награждать в отдельном патче. Надеюсь ты поймёшь.
[blizz]Судить меня дано лишь богу, другим я укажу дорогу
[/blizz]
Сообщение # 7 написано 19.01.2016 в 23:55
|
В своём отдельном скрипте в соответствующем методе пишешь
{ //.... Group* group = player->GetGroup(); //получаешь группу игрока if(!group) return; //если нет группы, то выходим и ничего не делаем for (GroupReference* itr = _group->GetFirstMember(); itr != NULL; itr = itr->next()) // по тому, как ты кидал, получаешь указатель на класс GroupReference и в цикле тут обрабатываются все члены группы if (Player* member = itr->getSource()) // если найден игрок, то ниже награждаешь member->ModifyHonorPoints(600); // награждаешь чем хочешь //... } // Для того, чтобы твой файл знал, что такое класс Group и прочее, подключаешь необходимые библиотеки |
Сдаюсь.
Код class script : public PlayerScript { public: script() : PlayerScript("script") { } void OnPVPKill(Player* killer, Player* /*killed*/) OVERRIDE { std::list<Unit*> partyList; killer->GetPartyMembers(partyList); for(auto itr = partyList.begin(); itr != partyList.end(); ++itr) if((*itr)->GetTypeId() == TYPEID_PLAYER) { Player* const partyMember = (*itr)->ToPlayer(); // Выдача награды. } } }; Учтите, что в цикле обрабатывается и сам убийца. Если хотите выдавать ему что-то особенное - поменяйте Код if((*itr)->GetTypeId() == TYPEID_PLAYER) на Код if((*itr)->GetTypeId() == TYPEID_PLAYER && (*itr) != killer) и обрабатывайте убийцу отдельно, вне цикла. |
Можно всё в одном цикле обрабатывать, массивы для этого даны
Сообщение # 10 написано 20.01.2016 в 02:15
|
К примеру, наградить всех апом. Убийце - 400 апа, остальным - 200:
UINT8 award_ap[] = {200,400}; .... и в цикле: member->ModifyHonorPoints(award_ap[(*itr) == killer]); И не нужно никаких дополнительных обработок больше
Сообщение # 12 написано 20.01.2016 в 02:20
|
К примеру, наградить всех апом. Убийце - 400 апа, остальным - 200:UINT8 award_ap[] = {200,400}; .... и в цикле: member->ModifyHonorPoints(award_ap[(*itr) == killer]); И не нужно никаких дополнительных обработок больше П.С: У Вас тут, кстати, ошибка: |
Такое тоже случается
Сообщение # 14 написано 20.01.2016 в 17:48
|
| |||
| |||