// // 파티원들에게 bWin에 따라 승/패 사실을 알리고 듀얼을 종료시킴. // void CParty::DoDuelResult( CParty *pDuelOther, BOOL bWin, int nAddFame, float fSubFameRatio ) { CUser *pMember; int i; for( i = 0; i < m_nSizeofMember; i ++ ) { pMember = g_UserMng.GetUserByPlayerID( m_aMember[i].m_uPlayerId ); if( IsValidObj( pMember ) ) { pMember->AddDuelPartyResult( pDuelOther, bWin ); // 각 멤버들에게 승/패 사실을 알림. / 상대파티원 리스트도 보냄. pMember->ClearDuelParty(); if( bWin ) { pMember->m_nFame += nAddFame; // 이긴측이면 명성 증가 pMember->AddDefinedText( TID_GAME_GETFAMEPOINT, "%d", nAddFame ); // xxx 명성 포인트가 증가 #ifdef __WORLDSERVER g_dpDBClient.SendLogPkPvp( pMember, NULL, nAddFame, 'E' ); #endif // __WORLDSERVER } else { int nDecVal; fSubFameRatio = fSubFameRatio / 100.0f; // 비율로 환산. nDecVal = (int)(pMember->m_nFame * fSubFameRatio); if( nDecVal == 0 ) nDecVal = 1; pMember->m_nFame -= nDecVal; if( pMember->m_nFame < 0 ) pMember->m_nFame = 0; pMember->AddDefinedText( TID_GAME_DECFAMEPOINT, "%d", nDecVal ); // xxx 명성 포인트가 감소. #ifdef __WORLDSERVER g_dpDBClient.SendLogPkPvp( NULL, pMember, nAddFame, 'E' ); #endif // __WORLDSERVER } // 바뀐 명성치를 pMember의 주위에 날려줌. g_UserMng.AddSetFame( pMember, pMember->m_nFame ); } } m_idDuelParty = 0; }
//int __EndQuest( int nPcId, int nQuestId, BOOL IsEndQuestCondition = TRUE ) int __EndQuest( int nPcId, int nQuestId, BOOL IsEndQuestCondition ) { int nNum; QuestProp* pQuestProp = prj.m_aPropQuest.GetAt( nQuestId ); if( pQuestProp ) { CUser* pUser = prj.GetUser( nPcId ); if( IsEndQuestCondition ) { if( __IsEndQuestCondition( pUser, nQuestId ) == 0 ) return FALSE; } // 보상 아이템 갯수 만큼, 인벤토리 여유가 있는가? int nItemNum = 0; for( int i = 0; i < pQuestProp->m_nEndRewardItemNum; i++ ) { QuestPropItem* pEndRewardItem = &pQuestProp->m_paEndRewardItem[ i ]; if( pEndRewardItem->m_nSex == -1 || pEndRewardItem->m_nSex == pUser->GetSex() ) { if( pEndRewardItem->m_nType == 0 ) { if( pEndRewardItem->m_nJobOrItem == -1 || pEndRewardItem->m_nJobOrItem == pUser->GetJob() ) { if( pEndRewardItem->m_nItemIdx ) { ItemProp* pItemProp = prj.GetItemProp( pEndRewardItem->m_nItemIdx ); int nDiv = pEndRewardItem->m_nItemNum / pItemProp->dwPackMax; int nSur = pEndRewardItem->m_nItemNum % pItemProp->dwPackMax; if( nSur ) nDiv++; nItemNum += nDiv; } } } else if( pEndRewardItem->m_nType == 1 ) { if( pEndRewardItem->m_nJobOrItem == -1 || pUser->GetItemNum( pEndRewardItem->m_nJobOrItem ) ) { if( pEndRewardItem->m_nItemIdx ) { ItemProp* pItemProp = prj.GetItemProp( pEndRewardItem->m_nItemIdx ); int nDiv = pEndRewardItem->m_nItemNum / pItemProp->dwPackMax; int nSur = pEndRewardItem->m_nItemNum % pItemProp->dwPackMax; if( nSur ) nDiv++; nItemNum += nDiv; } } } } } if( nItemNum > pUser->m_Inventory.GetEmptyCount() ) { pUser->AddDefinedText( TID_QUEST_NOINVENTORYSPACE ); // 인벤토리 공간이 없어서 퀘스트를 완료할 수 없습니다. RunScriptFunc rsf; rsf.wFuncType = FUNCTYPE_EXIT; pUser->AddRunScriptFunc( rsf ); return FALSE; } //////////////////////////// // 보상 지급 //////////////////////////// for( i = 0; i < pQuestProp->m_nEndRewardItemNum; i++ ) { QuestPropItem* pEndRewardItem = &pQuestProp->m_paEndRewardItem[ i ]; if( pEndRewardItem->m_nSex == -1 || pEndRewardItem->m_nSex == pUser->GetSex() ) { if( pEndRewardItem->m_nType == 0 ) { if( pEndRewardItem->m_nJobOrItem == -1 || pEndRewardItem->m_nJobOrItem == pUser->GetJob() ) { if( pEndRewardItem->m_nItemIdx ) { int nItemNum = pEndRewardItem->m_nItemNum; #ifdef __JEFF_11 #if __VER >= 13 // __CHIPI_QUESTITEM_FLAG __CreateItem( nPcId, pEndRewardItem->m_nItemIdx, nItemNum, pEndRewardItem->m_nAbilityOption, pEndRewardItem->m_byFlag ); #else // __CHIPI_QUESTITEM_FLAG __CreateItem( nPcId, pEndRewardItem->m_nItemIdx, nItemNum, pEndRewardItem->m_nAbilityOption ); #endif // __CHIPI_QUESTITEM_FLAG #else // __JEFF_11 __CreateItem( nPcId, pEndRewardItem->m_nItemIdx, nItemNum ); #endif // __JEFF_11 } } } else if( pEndRewardItem->m_nType == 1 ) { if( pEndRewardItem->m_nJobOrItem == -1 || pUser->GetItemNum( pEndRewardItem->m_nJobOrItem ) ) { if( pEndRewardItem->m_nItemIdx ) { int nItemNum = pEndRewardItem->m_nItemNum; #ifdef __JEFF_11 #if __VER >= 13 // __CHIPI_QUESTITEM_FLAG __CreateItem( nPcId, pEndRewardItem->m_nItemIdx, nItemNum, pEndRewardItem->m_nAbilityOption, pEndRewardItem->m_byFlag ); #else // __CHIPI_QUESTITEM_FLAG __CreateItem( nPcId, pEndRewardItem->m_nItemIdx, nItemNum, pEndRewardItem->m_nAbilityOption ); #endif // __CHIPI_QUESTITEM_FLAG #else // __JEFF_11 __CreateItem( nPcId, pEndRewardItem->m_nItemIdx, nItemNum ); #endif // __JEFF_11 } } } } } #if __VER >= 9 // __PET_0410 if( pQuestProp->m_bEndRewardPetLevelup ) pUser->PetLevelup(); #endif // __PET_0410 if( pQuestProp->m_nEndRewardGoldMin ) { nNum = pQuestProp->m_nEndRewardGoldMax - pQuestProp->m_nEndRewardGoldMin + 1; int nGold = pQuestProp->m_nEndRewardGoldMin + xRandom( nNum ); pUser->AddGold( nGold ); pUser->AddGoldText( nGold ); } if( pQuestProp->m_nEndRewardExpMin ) { nNum = pQuestProp->m_nEndRewardExpMax - pQuestProp->m_nEndRewardExpMin + 1; int nExp = pQuestProp->m_nEndRewardExpMin + xRandom( nNum ); if( pUser->AddExperience( nExp, TRUE, FALSE ) ) pUser->LevelUpSetting(); else pUser->ExpUpSetting(); pUser->AddSetExperience( pUser->GetExp1(), (WORD)pUser->m_nLevel, pUser->m_nSkillPoint, pUser->m_nSkillLevel ); pUser->AddDefinedText( TID_GAME_REAPEXP ); } if( pQuestProp->m_nEndRewardSkillPoint ) { pUser->AddSkillPoint( pQuestProp->m_nEndRewardSkillPoint ); pUser->AddSetExperience( pUser->GetExp1(), (WORD)pUser->m_nLevel, pUser->m_nSkillPoint, pUser->m_nSkillLevel ); g_dpDBClient.SendLogSkillPoint( LOG_SKILLPOINT_GET_QUEST, pQuestProp->m_nEndRewardSkillPoint, (CMover*)pUser, NULL ); } #if __VER >= 8 // __S8_PK if( pQuestProp->m_nEndRewardPKValueMin || pQuestProp->m_nEndRewardPKValueMax ) { if( pQuestProp->m_nEndRewardPKValueMin <= pQuestProp->m_nEndRewardPKValueMax ) { int nPKValue = pUser->GetPKValue() - xRandom( pQuestProp->m_nEndRewardPKValueMin, pQuestProp->m_nEndRewardPKValueMax + 1 ); if( nPKValue < 0 ) nPKValue = 0; pUser->SetPKValue( nPKValue ); pUser->AddPKValue(); g_dpDBClient.SendLogPkPvp( (CMover*)pUser, NULL, 0, 'P' ); #if __VER >= 13 // __HONORABLE_TITLE // 달인 pUser->CheckHonorStat(); g_UserMng.AddHonorTitleChange( pUser, pUser->m_nHonor); #endif // __HONORABLE_TITLE // 달인 } } #else // __VER >= 8 // __S8_PK if( pQuestProp->m_nEndRewardKarmaStyle ) { if( pQuestProp->m_nEndRewardKarmaStyle == 1 ) pUser->ChangeSlaughter( CHANGE_SLAUGHTER_SET, NULL, pQuestProp->m_nEndRewardKarmaPoint ); else if( pQuestProp->m_nEndRewardKarmaStyle == 2 ) { int nKarma = pUser->GetKarma(); pUser->ChangeSlaughter( CHANGE_SLAUGHTER_SET, NULL, nKarma + pQuestProp->m_nEndRewardKarmaPoint ); } } #endif // __VER >= 8 // __S8_PK #if __VER >= 9 // __S_9_ADD if( pQuestProp->m_nEndRewardTeleport != 0 ) pUser->REPLACE( g_uIdofMulti, pQuestProp->m_nEndRewardTeleport, pQuestProp->m_nEndRewardTeleportPos, REPLACE_NORMAL, nTempLayer ); #endif // __S_9_ADD // 시작시 변신을 했으면 종료시 변신 해제시킨다. if( pQuestProp->m_nBeginSetDisguiseMoverIndex ) { CUser* pUser = prj.GetUser( nPcId ); pUser->NoDisguise( NULL ); g_UserMng.AddNoDisguise( pUser ); } #if __VER >= 15 // __CAMPUS if( pQuestProp->m_nEndRewardTSP ) g_dpDBClient.SendUpdateCampusPoint( pUser->m_idPlayer, pQuestProp->m_nEndRewardTSP, TRUE, 'Q' ); if( pQuestProp->m_nEndRemoveTSP ) g_dpDBClient.SendUpdateCampusPoint( pUser->m_idPlayer, pQuestProp->m_nEndRemoveTSP, FALSE, 'Q' ); #endif // __CAMPUS //////////////////////////// // 아이템 제거 //////////////////////////// for( i = 0; i < 8; i++ ) { if( pQuestProp->m_nEndRemoveItemIdx[ i ] ) { int nItemNum = pQuestProp->m_nEndRemoveItemNum[ i ]; if( nItemNum > 0x7fff ) // 삭제될 아이템 개수가 short의 MAX를 넘으면.. { for( ; nItemNum > 0x7fff; ) { pUser->RemoveItemA( pQuestProp->m_nEndRemoveItemIdx[ i ], 0x7fff ); nItemNum -= 0x7fff; } } pUser->RemoveItemA( pQuestProp->m_nEndRemoveItemIdx[ i ], nItemNum ); } } if( pQuestProp->m_nEndRemoveGold ) __RemoveGold( nPcId, pQuestProp->m_nEndRemoveGold ); //////////////////////////// // 퀘스트 제거 (완료,진행 모두 제거함) //////////////////////////// for( i = 0; i < MAX_QUESTREMOVE; i++ ) { if( pQuestProp->m_anEndRemoveQuest[ i ] ) { __RemoveQuest( nPcId, pQuestProp->m_anEndRemoveQuest[ i ] ); } } // 퀘스트 종료 __SetQuestState( nPcId, nQuestId, QS_END ); } return 1; }