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(); }
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; }
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; }