void CSDKPlayerShared::StartRolling(bool bFromDive)
{
	if (!CanRoll())
		return;

	if (bFromDive)
		m_pOuter->Instructor_LessonLearned("rollafterdive");

	m_bRolling = true;
	m_bRollingFromDive = bFromDive;

	ForceUnzoom();

	m_vecRollDirection = m_pOuter->GetAbsVelocity();
	m_vecRollDirection.GetForModify().NormalizeInPlace();

	m_flRollTime = m_pOuter->GetCurrentTime();
}
Exemple #2
0
BOOL KLootList::IsVisible(KPlayer* pPlayer)
{
    BOOL bRetCode = FALSE;
    int nItemIndex = 0;
    KG_PROCESS_ERROR(m_pDoodad);
    KG_PROCESS_ERROR(m_pDoodad->m_bLooted == FALSE);

    for (nItemIndex = 0; nItemIndex < m_nItemCount; nItemIndex++)
    {
        if (CanLoot(nItemIndex, pPlayer) || CanRoll(nItemIndex, pPlayer, FALSE))
            break;
    }

    KG_PROCESS_ERROR((m_nItemCount != 0 && nItemIndex < m_nItemCount) || m_nMoney > 0);

    bRetCode = TRUE;
Exit0:
    return bRetCode;
}
Exemple #3
0
SKILL_RESULT_CODE KLootList::LootOrRollItem(KPlayer* pLooter, DWORD dwDoodadID, DWORD dwItemID, BOOL bCancel)
{
    SKILL_RESULT_CODE nResult = srcFailed;
    BOOL bRetCode = FALSE;
    BOOL bResult = FALSE;
    int nRandom = -1;

    KGLOG_PROCESS_ERROR(pLooter);

    KDoodad *pDoodad = g_ObjectManager.m_DoodadSet.GetObj(dwDoodadID);
    KGLOG_PROCESS_ERROR(pDoodad);

    //在表中找到指定的物品
    int nItemIndex = 0;
    for (; nItemIndex < MAX_LOOT_SIZE; nItemIndex++)
    {
        if (m_LootList[nItemIndex].pItem == NULL)
            continue;
        if (m_LootList[nItemIndex].pItem->m_dwID == dwItemID)
            break;
    }
    KG_PROCESS_ERROR_RET_CODE(nItemIndex < MAX_LOOT_SIZE, srcNotExistLootItem);

    bResult = CanLoot(nItemIndex, pLooter);
    if (bResult)
    {
        //拾取
        bRetCode = pLooter->m_ItemList.AddItem(m_LootList[nItemIndex].pItem);
        KG_PROCESS_ERROR_RET_CODE(bRetCode, srcAddLootItemFailed);

        m_LootList[nItemIndex].pItem = NULL;
        m_nLootedCount++;

        bRetCode = g_PlayerServer.DoRollItemMessage(pLooter, dwDoodadID, dwItemID, TRUE, nRandom);
        KGLOG_CHECK_ERROR(bRetCode);

        return srcSuccess;
    }

    bResult = CanRoll(nItemIndex, pLooter, TRUE);
    if (bResult)
    {
        for (int nOwnerIndex = 0; nOwnerIndex < m_nLooterCount; nOwnerIndex++)
        {
            if (m_pLooterList[nOwnerIndex] != pLooter)
                continue;

            //投一个100面的骰子
            if (!bCancel)
            {
                nRandom = g_Random(ROLL_ITEM_NUMBER) + 1;
                if (nRandom > m_LootList[nItemIndex].nRandom)
                {
                    //掷赢了,则更改胜利者
                    m_LootList[nItemIndex].pWinner = m_pLooterList[nOwnerIndex];
                    m_LootList[nItemIndex].nRandom = nRandom;
                }
                else if (nRandom == m_LootList[nItemIndex].nRandom)
                {
                    //平局,自动再掷一次
                    int nRoll = g_Random(2);
                    if (nRoll == 0)
                    {
                        m_LootList[nItemIndex].pWinner = m_pLooterList[nOwnerIndex];
                        m_LootList[nItemIndex].nRandom = nRandom;
                    }
                }
            }

            //取消掷骰子的权利
            m_LootList[nItemIndex].dwFlag[nOwnerIndex] = 1;
            m_LootList[nItemIndex].nRollCount--;

            //如果所有人都掷过了,那么自动放到胜利者的背包中
            KPlayer* pWinner = m_LootList[nItemIndex].pWinner;


            //同步LootList
            for (int nOwnIndex = 0; nOwnIndex < m_nLooterCount; nOwnIndex++)
            {
                bRetCode = g_PlayerServer.DoSyncLootList(m_pLooterList[nOwnIndex], m_pDoodad);
                KGLOG_CHECK_ERROR(bRetCode);
            }

            if (m_LootList[nItemIndex].nRollCount == 0 && pWinner)
            {
                bRetCode = pWinner->m_ItemList.AddItem(m_LootList[nItemIndex].pItem);
                KG_PROCESS_ERROR_RET_CODE(bRetCode, srcAddLootItemFailed);

                m_LootList[nItemIndex].pItem = NULL;
                m_nLootedCount++;

                bRetCode = g_PlayerServer.DoRollItemMessage(pWinner, dwDoodadID, dwItemID,
                           TRUE, nRandom);
                KGLOG_CHECK_ERROR(bRetCode);
            }
            else
            {
                bRetCode = g_PlayerServer.DoRollItemMessage(pLooter, dwDoodadID, dwItemID,
                           FALSE, nRandom);
                KGLOG_CHECK_ERROR(bRetCode);
            }
        }
        return srcSuccess;
    }
Exit0:
    //这里同步是因为有可能有玩家部分拾取了某个可叠加的物品
    bRetCode = g_PlayerServer.DoRollItemMessage(pLooter, dwDoodadID, dwItemID, FALSE, -2);
    KGLOG_CHECK_ERROR(bRetCode);

    return nResult;
}