• Страница 1 из 1
  • 1
Модератор форума: Dimitro  
OnPvPKill
Narko94
Рыцарь
В ScriptMgr.h есть функция:
OnPvPKill, если писать скрипт, то те кто в пати или рейде, не получат награды.
Только тот кто убил, как это исправить?
Чтобы к примеру хиллы или тот, кто помогал убивать, тоже получили награду.

Без кода в Player.cpp, нужно написать отдельный скрипт.

Заранее благодарю, мне не нужно писать за меня скрипт и т.д., просто укажите куда копать?
То как реализовать это в Player.cpp, я знаю, как реализовать в отдельном скрипте, хз.
[blizz]Судить меня дано лишь богу, другим я укажу дорогу
[/blizz]
Сообщение # 1 написано 19.01.2016 в 16:34
p620
Маршал
На 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).
Сообщение # 2 отредактировано p620 - Вторник, 19.01.2016, 19:09
Narko94
Рыцарь
p620, это уже совсем кругами пошёл, ибо в Player.cpp - это реализовано:


Вопрос в другом, всё это в Player.cpp, как реализовать это в отдельном скрипте.
Пробовал подрубать Player.h
Тогда у меня ругается на: if (_group)
И т.д.
[blizz]Судить меня дано лишь богу, другим я укажу дорогу
[/blizz]
Сообщение # 3 отредактировано Narko94 - Вторник, 19.01.2016, 20:23
p620
Маршал
Перед описанием класса там огромный комментарий, объясняющий, зачем он нужен и чем награждает.
Если Вас все устраивает, то и править ничего не нужно, ибо он отрабатывает при любом убийстве, совершенном игроком.
В противном случае опишите подробнее, чем Вы хотите награждать игроков, для получения более конкретных советов.
Сообщение # 4 написано 19.01.2016 в 22:43
Narko94
Рыцарь
p620, я описал, что мне нужно в отдельном скрипте это реализовать.

Цитата p620 ()
Перед описанием класса там огромный комментарий, объясняющий, зачем он нужен и чем награждает.

Я уже в самом первом посте и во 2ом своём посте, говорил, что я знаю, как реализовать в Player.cpp, мне нужно отдельно.
Как вынести всё это отдельно?? В отдельный скрипт.
[blizz]Судить меня дано лишь богу, другим я укажу дорогу
[/blizz]
Сообщение # 5 написано 19.01.2016 в 22:51
p620
Маршал
Проклятье, этот форум меня убивает. В общем, я составил цепочку цитат, которая явно демонстрирует Ваше хождение по кругу, форум все похерил, переделывать не буду, ибо не в первый раз за сегодня уже этим занимаюсь, напишу только вывод:
Перечитайте еще раз мой первый пост (первую часть, про подрубание к хуку). Если вопрос останется - сформулируйте его точнее и конкретнее, без "это", ссылок на какие-то другие посты/цитаты/etc. Тогда получите нормальный ответ.
Сообщение # 6 отредактировано p620 - Вторник, 19.01.2016, 23:34
Narko94
Рыцарь
Цитата p620 ()
Перед описанием класса там огромный комментарий, объясняющий, зачем он нужен и чем награждает.Если Вас все устраивает, то и править ничего не нужно, ибо он отрабатывает при любом убийстве, совершенном игроком.
В противном случае опишите подробнее, чем Вы хотите награждать игроков, для получения более конкретных советов.

Скажу, что меня не устраивает, но и править в самом Player.cpp мне не нужно!
Мне нужно в отдельном патче. Так понятно??
Не важно чем я его хочу наградить, итемом или хонором, мне нужно награждать в отдельном патче.

Надеюсь ты поймёшь.
[blizz]Судить меня дано лишь богу, другим я укажу дорогу
[/blizz]
Сообщение # 7 написано 19.01.2016 в 23:55
Ranege
Чемпион
В своём отдельном скрипте в соответствующем методе пишешь
{
//....
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 и прочее, подключаешь необходимые библиотеки
Сообщение # 8 отредактировано Ranege - Среда, 20.01.2016, 02:10
p620
Маршал
Сдаюсь.
Код
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)

и обрабатывайте убийцу отдельно, вне цикла.
Сообщение # 9 отредактировано p620 - Среда, 20.01.2016, 02:16
Ranege
Чемпион
Цитата p620 ()
обрабатывайте убийцу отдельно

Можно всё в одном цикле обрабатывать, массивы для этого даны
Сообщение # 10 написано 20.01.2016 в 02:15
p620
Маршал
Цитата Ranege ()
Можно всё в одном цикле обрабатывать, массивы для этого даны

Конечно можно, написал для ясности. Только какие это, прошу прощения, массивы Вы имеете в виду? =)
Сообщение # 11 написано 20.01.2016 в 02:17
Ranege
Чемпион
К примеру, наградить всех апом. Убийце - 400 апа, остальным - 200:

UINT8 award_ap[] = {200,400};

....

и в цикле:

member->ModifyHonorPoints(award_ap[(*itr) == killer]);

И не нужно никаких дополнительных обработок больше
Сообщение # 12 написано 20.01.2016 в 02:20
p620
Маршал
Цитата Ranege ()
К примеру, наградить всех апом. Убийце - 400 апа, остальным - 200:UINT8 award_ap[] = {200,400};

....

и в цикле:

member->ModifyHonorPoints(award_ap[(*itr) == killer]);

И не нужно никаких дополнительных обработок больше
Да, можно и так, но для этого пришлось бы писать отдельное объяснение. Причем, в любом случае.

П.С: У Вас тут, кстати, ошибка:
Цитата Ranege ()
UINT8 award_ap[] = {200,400};
Сообщение # 13 отредактировано p620 - Среда, 20.01.2016, 03:44
Ranege
Чемпион
Сообщение # 14 написано 20.01.2016 в 17:48
  • Страница 1 из 1
  • 1
Поиск: