示例#1
0
/**
  Function that refresh all battlefield players
*/
void Battlefield::UpdateBattlefieldPlayers()
{
    bool bRemoved = false;
    for (BattlefieldPlayerDataMap::iterator itr = m_activePlayers.begin(); itr != m_activePlayers.end();)
    {
        if (itr->second->removeTime && itr->second->removeTime + itr->second->removeDelay < time(nullptr))
        {
            // kick player from zone
            delete itr->second;
            if (Player* player = sObjectMgr.GetPlayer(itr->first))
                KickBattlefieldPlayer(player);

            // remove player from group
            if (HasPlayer(itr->first))
            {
                RemovePlayerFromRaid(itr->first);
                bRemoved = true;
            }

            m_activePlayers.erase(itr++);

        }
        else
            ++itr;
    }

    // call the update function for specific script action
    if (bRemoved)
        OnBattlefieldPlayersUpdate();
}
bool pyVaultPlayerInfoListNode::AddPlayer( uint32_t playerID )
{
    if (HasPlayer(playerID))
        return true;
        
    if (!fNode)
        return false;
        
    NetVaultNode * templateNode = NEWZERO(NetVaultNode);
    templateNode->IncRef();
    templateNode->SetNodeType(plVault::kNodeType_PlayerInfo);
    VaultPlayerInfoNode access(templateNode);
    access.SetPlayerId(playerID);

    ARRAY(unsigned) nodeIds;
    VaultLocalFindNodes(templateNode, &nodeIds);
    
    if (!nodeIds.Count())
        VaultFindNodesAndWait(templateNode, &nodeIds);
        
    if (nodeIds.Count())
        VaultAddChildNodeAndWait(fNode->nodeId, nodeIds[0], VaultGetPlayerId());
        
    templateNode->DecRef();
    return nodeIds.Count() != 0;
}
示例#3
0
/**
  Function that handles player invite response

  @param   player that responded
  @param   whether the player has accepted or not
*/
void Battlefield::HandleQueueInviteResponse(Player* player, bool accepted)
{
    if (!accepted || HasPlayer(player->GetObjectGuid()))
        return;

    PvpTeamIndex teamIdx = GetTeamIndexByTeamId(player->GetTeam());

    // reject if queue battlefield is full
    if (IsTeamFull(teamIdx))
    {
        player->GetSession()->SendBattlefieldQueueResponse(m_battleFieldId, m_zoneId, true, true);
        return;
    }

    if (m_queuedPlayers[teamIdx].find(player->GetObjectGuid()) == m_queuedPlayers[teamIdx].end())
    {
        if (GetBattlefieldStatus() == BF_STATUS_IN_PROGRESS)
        {
            m_invitedPlayers[teamIdx][player->GetObjectGuid()] = time(nullptr) + BF_TIME_TO_ACCEPT;
            player->GetSession()->SendBattlefieldWarInvite(m_battleFieldId, m_zoneId, BF_TIME_TO_ACCEPT);
        }
        else
        {
            m_queuedPlayers[teamIdx].insert(player->GetObjectGuid());
            player->GetSession()->SendBattlefieldQueueResponse(m_battleFieldId, m_zoneId, true, false);
        }
    }
}
示例#4
0
/**
  Function that adds a player to the players of the affected battlefield zones

  @param   player to add
  @param   whether zone is main outdoor pvp zone or a affected zone
*/
void Battlefield::HandlePlayerEnterZone(Player* player, bool isMainZone)
{
    OutdoorPvP::HandlePlayerEnterZone(player, isMainZone);

    // invite to group or queue
    if (!HasPlayer(player->GetObjectGuid()))
    {
        if (GetBattlefieldStatus() == BF_STATUS_IN_PROGRESS)
        {
            m_invitedPlayers[GetTeamIndexByTeamId(player->GetTeam())][player->GetObjectGuid()] = time(nullptr) + BF_TIME_TO_ACCEPT;
            player->GetSession()->SendBattlefieldWarInvite(m_battleFieldId, m_zoneId, BF_TIME_TO_ACCEPT);
        }
        else if (GetBattlefieldStatus() == BF_STATUS_COOLDOWN && m_timer < m_startInviteDelay)
            InvitePlayerToQueue(player);
    }

    // check if player is already marked as active
    BattlefieldPlayerDataMap::iterator itr = m_activePlayers.find(player->GetObjectGuid());
    if (itr == m_activePlayers.end())
        InitPlayerBattlefieldData(player);
    else
    {
        if (GetBattlefieldStatus() == BF_STATUS_IN_PROGRESS && itr->second->removeTime && m_startTime > itr->second->removeTime)
            SetupPlayerPosition(player);

        itr->second->removeTime = 0;
    }
}
示例#5
0
/**
  Function that handles the AFK status

  @param   player to be punished
*/
void Battlefield::HandlePlayerAFK(Player* player)
{
    if (GetBattlefieldStatus() != BF_STATUS_IN_PROGRESS || !HasPlayer(player->GetObjectGuid()))
        return;

    RemovePlayerFromRaid(player->GetObjectGuid());
    player->GetSession()->SendBattlefieldLeaveMessage(m_battleFieldId, BATTLEFIELD_LEAVE_REASON_EXITED);
    KickBattlefieldPlayer(player);
}
示例#6
0
/**
  Function that handles player teleport response

  @param   player that responded
  @param   whether the player has accepted or not
*/
void Battlefield::HandleWarInviteResponse(Player* player, bool accepted)
{
    if (HasPlayer(player->GetObjectGuid()))
        return;

    if (accepted)
    {
        PvpTeamIndex teamIdx = GetTeamIndexByTeamId(player->GetTeam());
        std::map<ObjectGuid, time_t>::iterator itr = m_invitedPlayers[teamIdx].find(player->GetObjectGuid());

        // he was not invited by core
        if (itr == m_invitedPlayers[teamIdx].end())
            return;

        m_invitedPlayers[teamIdx].erase(itr);

        if (CanAddPlayerToRaid(player))
        {
            DEBUG_LOG("Battlefield: CanAddPlayerToRaid for %s returned: TRUE", player->GetGuidStr().c_str());
            player->GetSession()->SendBattlefieldEnteredResponse(m_battleFieldId);
        }
        else
            DEBUG_LOG("Battlefield: CanAddPlayerToRaid for %s returned: FALSE", player->GetGuidStr().c_str());

        // ToDo: recheck this!
        if (player->GetZoneId() == m_zoneId)
        {
            if (m_activePlayers.find(player->GetObjectGuid()) == m_activePlayers.end())  // must never happen
                InitPlayerBattlefieldData(player);
        }
    }
    else
    {
        // kick players which refuse the war invite if battlefield is in progress
        if (GetBattlefieldStatus() == BF_STATUS_IN_PROGRESS && player->GetZoneId() == m_zoneId)
        {
            player->GetSession()->SendBattlefieldLeaveMessage(m_battleFieldId, BATTLEFIELD_LEAVE_REASON_EXITED);
            if (m_activePlayers.find(player->GetObjectGuid()) != m_activePlayers.end())
            {
                m_activePlayers[player->GetObjectGuid()]->removeTime = time(nullptr);
                m_activePlayers[player->GetObjectGuid()]->removeDelay = BF_UNACCEPTED_REMOVE_DELAY;
            }
        }
    }

    // notify battlefield
    UpdatePlayerBattleResponse(player);
}
示例#7
0
/**
  Function that removes a player from the players of the affected battlefield zones

  @param   player to remove
  @param   whether zone is main outdoor pvp zone or a affected zone
*/
void Battlefield::HandlePlayerLeaveZone(Player* player, bool isMainZone)
{
    OutdoorPvP::HandlePlayerLeaveZone(player, isMainZone);

    BattlefieldPlayerDataMap::iterator itr = m_activePlayers.find(player->GetObjectGuid());
    if (itr != m_activePlayers.end())
    {
        // remove from battlefield if active
        if (HasPlayer(itr->first))
        {
            player->GetSession()->SendBattlefieldLeaveMessage(m_battleFieldId, BATTLEFIELD_LEAVE_REASON_EXITED);
            itr->second->removeTime = time(nullptr);
            itr->second->removeDelay = BF_UNACCEPTED_REMOVE_DELAY;
        }
        else
            m_activePlayers.erase(itr);
    }
}
示例#8
0
/**
  Function that handles player invite to queue

  @param   player to be invited
*/
void Battlefield::InvitePlayerToQueue(Player* player)
{
    if (HasPlayer(player->GetObjectGuid()))
        return;

    PvpTeamIndex teamIdx = GetTeamIndexByTeamId(player->GetTeam());

    // he is in queue or waiting to accept teleport button
    if (m_queuedPlayers[teamIdx].find(player->GetObjectGuid()) != m_queuedPlayers[teamIdx].end())
        return;
    if (m_invitedPlayers[teamIdx].find(player->GetObjectGuid()) != m_invitedPlayers[teamIdx].end())
        return;

    if (!IsTeamFull(teamIdx))
        player->GetSession()->SendBattlefieldQueueInvite(m_battleFieldId);
    else
        player->GetSession()->SendBattlefieldQueueResponse(m_battleFieldId, m_zoneId, true, true);
}
示例#9
0
/**
  Function that rewards the given team players

  @param   kill credit
  @param   team
  @param   source object
*/
void Battlefield::QuestCreditTeam(uint32 credit, Team team, WorldObject* source)
{
    for (auto& m_zonePlayer : m_zonePlayers)
    {
        if (!m_zonePlayer.first || !HasPlayer(m_zonePlayer.first))
            continue;

        Player* player = sObjectMgr.GetPlayer(m_zonePlayer.first);
        if (!player)
            continue;

        // check if player is eligible for kill credit
        if (!source || !credit || player->GetTeam() != team || !player->IsAtGroupRewardDistance(source))
            continue;

        player->KilledMonsterCredit(credit);
    }
}
示例#10
0
void pyVaultPlayerInfoListNode::AddPlayer( uint32_t playerID )
{
    if (HasPlayer(playerID) || !fNode)
        return;

    NetVaultNode* templateNode = new NetVaultNode();
    templateNode->IncRef();
    templateNode->SetNodeType(plVault::kNodeType_PlayerInfo);
    VaultPlayerInfoNode access(templateNode);
    access.SetPlayerId(playerID);

    ARRAY(uint32_t) nodeIds;
    VaultLocalFindNodes(templateNode, &nodeIds);

    // So, if we know about this node, we can take it easy. If not, we lazy load it.
    if (nodeIds.Count())
        VaultAddChildNode(fNode->GetNodeId(), nodeIds[0], VaultGetPlayerId(), nullptr, nullptr);
    else {
        fNode->IncRef();
        VaultFindNodes(templateNode, IAddPlayer_NodesFound, fNode);
    }
}
示例#11
0
/**
  Function that handles player queue exit request

  @param   player to exit queue
*/
void Battlefield::HandleExitRequest(Player* player)
{
    // if already active in battlefield
    if (HasPlayer(player->GetObjectGuid()))
    {
        player->GetSession()->SendBattlefieldLeaveMessage(m_battleFieldId, BATTLEFIELD_LEAVE_REASON_EXITED);

        RemovePlayerFromRaid(player->GetObjectGuid());

        if (m_activePlayers.find(player->GetObjectGuid()) != m_activePlayers.end())
        {
            m_activePlayers[player->GetObjectGuid()]->removeTime = time(nullptr);
            m_activePlayers[player->GetObjectGuid()]->removeDelay = BF_UNACCEPTED_REMOVE_DELAY;
        }
    }
    // else remove only from queue
    else
    {
        std::set<ObjectGuid>::iterator itr = m_queuedPlayers[GetTeamIndexByTeamId(player->GetTeam())].find(player->GetObjectGuid());
        if (itr != m_queuedPlayers[GetTeamIndexByTeamId(player->GetTeam())].end())
        {
            m_queuedPlayers[GetTeamIndexByTeamId(player->GetTeam())].erase(itr);

            player->GetSession()->SendBattlefieldLeaveMessage(m_battleFieldId, BATTLEFIELD_LEAVE_REASON_EXITED);

            if (m_activePlayers.find(player->GetObjectGuid()) != m_activePlayers.end())
            {
                m_activePlayers[player->GetObjectGuid()]->removeTime = time(nullptr);
                m_activePlayers[player->GetObjectGuid()]->removeDelay = BF_UNACCEPTED_REMOVE_DELAY;
            }
        }
    }

    // notify battlefield
    UpdatePlayerExitRequest(player);
}
bool PlayerContext::CreatePlayer(TV *tv, QWidget *widget,
                                 TVState desiredState,
                                 bool embed, const QRect &embedbounds,
                                 bool muted)
{
    if (HasPlayer())
    {
        LOG(VB_GENERAL, LOG_ERR, LOC +
                "Attempting to setup a player, but it already exists.");
        return false;
    }

    uint playerflags = kDecodeAllowEXT; // allow VDA etc for normal playback
    playerflags |= muted              ? kAudioMuted : kNoFlags;
    playerflags |= useNullVideo       ? kVideoIsNull : kNoFlags;
    playerflags |= nohardwaredecoders ? kNoFlags : kDecodeAllowGPU;

    MythPlayer *player = NULL;
    if (kState_WatchingBD  == desiredState)
        player = new MythBDPlayer((PlayerFlags)playerflags);
    else if (kState_WatchingDVD == desiredState)
        player = new MythDVDPlayer((PlayerFlags)playerflags);
    else
        player = new MythPlayer((PlayerFlags)playerflags);

    QString passthru_device = 
        gCoreContext->GetNumSetting("PassThruDeviceOverride", false) ?
        gCoreContext->GetSetting("PassThruOutputDevice") : QString::null;

    player->SetPlayerInfo(tv, widget, this);
    AudioPlayer *audio = player->GetAudio();
    audio->SetAudioInfo(gCoreContext->GetSetting("AudioOutputDevice"),
                        passthru_device,
                        gCoreContext->GetNumSetting("AudioSampleRate", 44100));
    audio->SetStretchFactor(ts_normal);
    player->SetLength(playingLen);

    player->SetVideoFilters((useNullVideo) ? "onefield" : "");

    if (!IsAudioNeeded())
        audio->SetNoAudio();
    else
    {
        QString subfn = buffer->GetSubtitleFilename();
        if (!subfn.isEmpty() && player->GetSubReader())
            player->GetSubReader()->LoadExternalSubtitles(subfn);
    }

    if (embed && !embedbounds.isNull())
        player->EmbedInWidget(embedbounds);

    bool isWatchingRecording = (desiredState == kState_WatchingRecording);
    player->SetWatchingRecording(isWatchingRecording);

    SetPlayer(player);

    if (pipState == kPIPOff || pipState == kPBPLeft)
    {
        if (audio->HasAudioOut())
        {
            QString errMsg = audio->ReinitAudio();
        }
    }
    else if (pipState == kPBPRight)
        player->SetMuted(true);

    return StartPlaying(-1);
}
示例#13
0
bool PlayerContext::CreatePlayer(TV *tv, QWidget *widget,
                                 TVState desiredState,
                                 WId embedwinid, const QRect *embedbounds,
                                 bool muted)
{
    int exact_seeking = gCoreContext->GetNumSetting("ExactSeeking", 0);

    if (HasPlayer())
    {
        VERBOSE(VB_IMPORTANT, LOC_ERR +
                "Attempting to setup a player, but it already exists.");
        return false;
    }

    MythPlayer *player = NULL;
    if (kState_WatchingBD  == desiredState)
        player = new MythBDPlayer(muted);
    else if (kState_WatchingDVD == desiredState)
        player = new MythDVDPlayer(muted);
    else
        player = new MythPlayer(muted);

    if (nohardwaredecoders)
        player->DisableHardwareDecoders();

    QString passthru_device = gCoreContext->GetNumSetting(
        "PassThruDeviceOverride", false) ?
        gCoreContext->GetSetting("PassThruOutputDevice") : QString::null;

    player->SetPlayerInfo(tv, widget, exact_seeking, this);
    AudioPlayer *audio = player->GetAudio();
    audio->SetAudioInfo(gCoreContext->GetSetting("AudioOutputDevice"),
                        passthru_device,
                        gCoreContext->GetNumSetting("AudioSampleRate", 44100));
    audio->SetStretchFactor(ts_normal);
    player->SetLength(playingLen);

    if (useNullVideo)
        player->SetNullVideo();

    player->SetVideoFilters((useNullVideo) ? "onefield" : "");

    if (!IsAudioNeeded())
        audio->SetNoAudio();
    else
    {
        QString subfn = buffer->GetSubtitleFilename();
        if (!subfn.isEmpty() && player->GetSubReader())
            player->GetSubReader()->LoadExternalSubtitles(subfn);
    }

    if ((embedwinid > 0) && embedbounds)
    {
        player->EmbedInWidget(
            embedbounds->x(), embedbounds->y(),
            embedbounds->width(), embedbounds->height(), embedwinid);
    }

    bool isWatchingRecording = (desiredState == kState_WatchingRecording);
    player->SetWatchingRecording(isWatchingRecording);

    SetPlayer(player);

    if (pipState == kPIPOff || pipState == kPBPLeft)
    {
        if (audio->HasAudioOut())
        {
            QString errMsg = audio->ReinitAudio();
        }
    }
    else if (pipState == kPBPRight)
        player->SetMuted(true);

    return StartPlaying(-1);
}