DragonNest/Server/ServerCommon/DnWorldGateStruct.cpp
Cussrro 47f7895977 Revert "修复编码问题"
This reverts commit 9e69c01767.
2024-12-21 10:04:04 +08:00

263 lines
No EOL
12 KiB
C++
Raw Permalink Blame History

#include "Stdafx.h"
#include "DnWorldGateStruct.h"
#include "DNGameDataManager.h"
#ifdef _GAMESERVER
#include "DnPartyTask.h"
#include "DNUserSession.h"
#include "DnPlayerActor.h"
#include "DNGameServerScriptAPI.h"
EWorldEnum::PermitGateEnum DungeonGateStruct::CanEnterDungeon( CMultiRoom *pRoom, std::vector<char> *cVecLessLevelActorIndex, std::vector<char> *cVecNotEnoughItemActorIndex, std::vector<char> *cVecExceedTryActorIndex , std::vector<char> *cVecNotRideVehicleIndex )
{
int nCount = (int)CDnPartyTask::GetInstance(pRoom).GetUserCountWithoutGM();
int nWholeCount = (int)CDnPartyTask::GetInstance(pRoom).GetUserCount();
EWorldEnum::PermitGateEnum PermitFlag = EWorldEnum::PermitEnter;
if( nMinPartyCount != -1 ) {
if( nCount < nMinPartyCount ) PermitFlag = (EWorldEnum::PermitGateEnum)( PermitFlag | EWorldEnum::PermitLessPartyCount );
}
if( nMaxPartyCount != -1 ) {
if( nCount > nMaxPartyCount ) PermitFlag = (EWorldEnum::PermitGateEnum)( PermitFlag | EWorldEnum::PermitLessPartyCount );
}
int nMapIndexForClearCount = nMapIndex;
#if defined (PRE_SHARE_MAP_CLEARCOUNT)
EWorldEnum::MapSubTypeEnum nMapSubType = MapSubType;
if( nShareCountMapIndex > 0 )
{
nMapIndexForClearCount = nShareCountMapIndex;
nMapSubType = ShareMapSubType;
}
#endif
for( int i=0; i<nWholeCount; i++ )
{
CDNGameRoom::PartyStruct* pPartyStruct = CDnPartyTask::GetInstance(pRoom).GetPartyData(i);
CDNUserSession *pSession = pPartyStruct->pSession;
if (pSession->bIsGMTrace()) continue;
// 錳楚 Attribute 陛 ホ鼻 偵褐厩歷朝等..雖旎 檜鼻ビ啪 寰脹棻.
int nLevel = pSession->GetLevel();
if( pSession->GetActorHandle() ) nLevel = pSession->GetActorHandle()->GetLevel();
if( nMinLevel != -1 ) {
if( nLevel < nMinLevel ) {
PermitFlag = (EWorldEnum::PermitGateEnum)( PermitFlag | EWorldEnum::PermitLessPlayerLevel );
if( cVecLessLevelActorIndex && std::find( cVecLessLevelActorIndex->begin(), cVecLessLevelActorIndex->end(), (char)i ) == cVecLessLevelActorIndex->end() ) cVecLessLevelActorIndex->push_back( (char)i );
}
}
if( nMaxLevel != -1 ) {
if( nLevel > nMaxLevel ) {
PermitFlag = (EWorldEnum::PermitGateEnum)( PermitFlag | EWorldEnum::PermitLessPlayerLevel );
if( cVecLessLevelActorIndex && std::find( cVecLessLevelActorIndex->begin(), cVecLessLevelActorIndex->end(), (char)i ) == cVecLessLevelActorIndex->end() ) cVecLessLevelActorIndex->push_back( (char)i );
}
}
if( nNeedItemID > 0 && nNeedItemCount > 0 ) {
#if defined(PRE_ADD_68838)
if(g_pDataManager->GetItemMainType(nNeedItemID) == ITEMTYPE_STAGE_COMPLETE_USEITEM)
{
//檣漸+議蓮檣漸縑 殮濰掏檜 ノ蹂フ 偎熱虜躑 氈朝雖 <20>檣フ棻
int nUserTicketCount = 0;
if(g_pDataManager->IsCashItem(nNeedItemID))
nUserTicketCount = pSession->GetItem()->GetCashItemCountByItemID(nNeedItemID);
else
nUserTicketCount = pSession->GetItem()->GetInventoryItemCount(nNeedItemID);
if(nUserTicketCount < nNeedItemCount)
{
PermitFlag = (EWorldEnum::PermitGateEnum)( PermitFlag | EWorldEnum::PermitNotEnoughItem );
if( cVecNotEnoughItemActorIndex && std::find( cVecNotEnoughItemActorIndex->begin(), cVecNotEnoughItemActorIndex->end(), (char)i ) == cVecNotEnoughItemActorIndex->end() ) cVecNotEnoughItemActorIndex->push_back( (char)i );
}
}
else if( pSession->GetItem()->GetInventoryItemCount( nNeedItemID ) < nNeedItemCount )
{
PermitFlag = (EWorldEnum::PermitGateEnum)( PermitFlag | EWorldEnum::PermitNotEnoughItem );
if( cVecNotEnoughItemActorIndex && std::find( cVecNotEnoughItemActorIndex->begin(), cVecNotEnoughItemActorIndex->end(), (char)i ) == cVecNotEnoughItemActorIndex->end() ) cVecNotEnoughItemActorIndex->push_back( (char)i );
}
#else
if( pSession->GetItem()->GetInventoryItemCount( nNeedItemID ) < nNeedItemCount ) {
PermitFlag = (EWorldEnum::PermitGateEnum)( PermitFlag | EWorldEnum::PermitNotEnoughItem );
if( cVecNotEnoughItemActorIndex && std::find( cVecNotEnoughItemActorIndex->begin(), cVecNotEnoughItemActorIndex->end(), (char)i ) == cVecNotEnoughItemActorIndex->end() ) cVecNotEnoughItemActorIndex->push_back( (char)i );
}
#endif // #if defined(PRE_ADD_68838)
}
if( bNeedVehicle ) {
bool bExistVehicle = false;
TVehicle *pEquipVehicle = pSession->GetItem()->GetVehicleEquip();
if( ( pEquipVehicle && pEquipVehicle->Vehicle[Vehicle::Slot::Body].nItemID > 0 ) || pSession->GetItem()->GetVehicleInventoryCount() > 0 )
bExistVehicle = true;
if( !bExistVehicle )
{
PermitFlag = (EWorldEnum::PermitGateEnum)( PermitFlag | EWorldEnum::PermitNotRideVehicle );
if( cVecNotRideVehicleIndex && std::find( cVecNotRideVehicleIndex->begin(), cVecNotRideVehicleIndex->end(), (char)i ) == cVecNotRideVehicleIndex->end() ) cVecNotRideVehicleIndex->push_back( (char)i );
}
}
if( this->nNeedClearMissionID > 0 && pPartyStruct->bLeader == true )
{
DNTableFileFormat *pSox = GetDNTable( CDnTableDB::TMISSION );
int nTargetArrayIndex = pSox->GetArrayIndex( this->nNeedClearMissionID );
if( api_user_IsMissionAchieved( static_cast<CDNGameRoom*>(pRoom), pSession->GetSessionID(), nTargetArrayIndex ) != 1 )
{
PermitFlag = (EWorldEnum::PermitGateEnum)( PermitFlag | EWorldEnum::PermitMission );
}
}
#if defined (PRE_SHARE_MAP_CLEARCOUNT)
switch( nMapSubType ) {
#else
switch( MapSubType ) {
#endif
case EWorldEnum::MapSubTypeNest:
{
int nExpandNestClearCount = pSession->m_nExpandNestClearCount;
int nPCBangExpandNestClearCount = g_pDataManager->GetPCBangNestClearCount(pSession->GetPCBangGrade(), nMapIndexForClearCount);
if (!bExpandable){
nExpandNestClearCount = 0;
nPCBangExpandNestClearCount = 0;
}
if( pSession->GetNestClearTotalCount( nMapIndexForClearCount ) >= (nMaxTryCount + nExpandNestClearCount + nPCBangExpandNestClearCount) )
{
PermitFlag = (EWorldEnum::PermitGateEnum)( PermitFlag | EWorldEnum::PermitExceedTryCount );
if( cVecExceedTryActorIndex && std::find( cVecExceedTryActorIndex->begin(), cVecExceedTryActorIndex->end(), (char)i ) == cVecExceedTryActorIndex->end() ) cVecExceedTryActorIndex->push_back( (char)i );
}
}
break;
#if defined(PRE_ADD_TSCLEARCOUNTEX)
case EWorldEnum::MapSubTypeTreasureStage:
{
int nExpandTreasureStageClearCount = pSession->m_nExpandTreasureStageClearCount;
if (!bExpandable){
nExpandTreasureStageClearCount = 0;
}
if( pSession->GetNestClearTotalCount( nMapIndexForClearCount ) >= (nMaxTryCount + nExpandTreasureStageClearCount) ) {
PermitFlag = (EWorldEnum::PermitGateEnum)( PermitFlag | EWorldEnum::PermitExceedTryCount );
if( cVecExceedTryActorIndex && std::find( cVecExceedTryActorIndex->begin(), cVecExceedTryActorIndex->end(), (char)i ) == cVecExceedTryActorIndex->end() ) cVecExceedTryActorIndex->push_back( (char)i );
}
break;
}
#endif // #if defined(PRE_ADD_TSCLEARCOUNTEX)
case EWorldEnum::MapSubTypeEvent:
case EWorldEnum::MapSubTypeChaosField:
case EWorldEnum::MapSubTypeDarkLair:
#if !defined(PRE_ADD_TSCLEARCOUNTEX)
#if defined( PRE_ADD_SUBTYPE_TREASURESTAGE )
case EWorldEnum::MapSubTypeTreasureStage:
#endif
#endif // #if defined(PRE_ADD_TSCLEARCOUNTEX)
#if defined(PRE_ADD_DRAGON_FELLOWSHIP)
case EWorldEnum::MapSubTypeFellowship:
#endif // #if defined(PRE_ADD_DRAGON_FELLOWSHIP)
if( pSession->GetNestClearTotalCount( nMapIndexForClearCount ) >= nMaxTryCount ) {
PermitFlag = (EWorldEnum::PermitGateEnum)( PermitFlag | EWorldEnum::PermitExceedTryCount );
if( cVecExceedTryActorIndex && std::find( cVecExceedTryActorIndex->begin(), cVecExceedTryActorIndex->end(), (char)i ) == cVecExceedTryActorIndex->end() ) cVecExceedTryActorIndex->push_back( (char)i );
}
break;
}
}
#if defined (PRE_WORLDCOMBINE_PARTY)
CDNGameRoom* pGameRoom = static_cast<CDNGameRoom*>(pRoom);
if (pGameRoom && pGameRoom->IsCloseTargetMap(nMapIndex))
PermitFlag = EWorldEnum::PermitClose;
#endif
return PermitFlag;
}
#endif
GateStruct * CalcMapInfo( int nMapIndex )
{
DNTableFileFormat *pSox = GetDNTable( CDnTableDB::TMAP );
char szLabel[64];
std::string szTemp;
if( pSox->IsExistItem( nMapIndex ) == false ) return NULL;
GateStruct *pStruct = NULL;
EWorldEnum::MapTypeEnum MapType = (EWorldEnum::MapTypeEnum)pSox->GetFieldFromLablePtr( nMapIndex, "_MapType" )->GetInteger();
switch( MapType ) {
case EWorldEnum::MapTypeDungeon:
pStruct = new DungeonGateStruct;
break;
default:
pStruct = new IBoostPoolGateStruct;
break;
}
pStruct->nMapIndex = nMapIndex;
pStruct->MapType = MapType;
pStruct->MapSubType = (EWorldEnum::MapSubTypeEnum)pSox->GetFieldFromLablePtr( nMapIndex, "_MapSubType" )->GetInteger();
pStruct->Environment = (EWorldEnum::LandEnvironment)pSox->GetFieldFromLablePtr( nMapIndex, "_Environment" )->GetInteger();
for( int j=0; j<10; j++ ) {
sprintf_s( szLabel, "_ToolName%d", j + 1 );
szTemp = pSox->GetFieldFromLablePtr( nMapIndex, szLabel )->GetString();
if( szTemp.empty() ) continue;
pStruct->szVecToolMapName.push_back( szTemp );
}
static char *szFatigueStr[] = { "_FatigueEasy", "_DecFatigue", "_FatigueHard", "_FatigueMaster", "_FatigueAbyss" };
for( int i=0; i<5; i++ ) {
pStruct->nFatigue[i] = pSox->GetFieldFromLablePtr( nMapIndex, szFatigueStr[i] )->GetInteger();
}
pStruct->PermitFlag = EWorldEnum::PermitEnter;
pStruct->nMaxTryCount = pSox->GetFieldFromLablePtr( nMapIndex, "_MaxClearCount" )->GetInteger();
pStruct->bExpandable = pSox->GetFieldFromLablePtr( nMapIndex, "_Expandable" )->GetInteger() ? true : false;
if( MapType == EWorldEnum::MapTypeDungeon ) {
int nTemp = pSox->GetFieldFromLablePtr( nMapIndex, "_EnterConditionTableID" )->GetInteger();
if( nTemp > 0 ) {
DNTableFileFormat *pDungeonSox = GetDNTable( CDnTableDB::TDUNGEONENTER );
if( pDungeonSox->IsExistItem( nTemp ) ) {
DungeonGateStruct *pDungeonStruct = (DungeonGateStruct *)pStruct;
pDungeonStruct->nMinLevel = pDungeonSox->GetFieldFromLablePtr( nTemp, "_LvlMin" )->GetInteger();
pDungeonStruct->nMaxLevel = pDungeonSox->GetFieldFromLablePtr( nTemp, "_LvlMax" )->GetInteger();
pDungeonStruct->nMinPartyCount = pDungeonSox->GetFieldFromLablePtr( nTemp, "_PartyOneNumMin" )->GetInteger();
pDungeonStruct->nMaxPartyCount = pDungeonSox->GetFieldFromLablePtr( nTemp, "_PartyOneNumMax" )->GetInteger();
pDungeonStruct->nMaxUsableCoin = pDungeonSox->GetFieldFromLablePtr( nTemp, "_MaxUsableCoin" )->GetInteger();
pDungeonStruct->nAbyssMinLevel = pDungeonSox->GetFieldFromLablePtr( nTemp, "_AbyssLvlMin" )->GetInteger();
pDungeonStruct->nAbyssMaxLevel = pDungeonSox->GetFieldFromLablePtr( nTemp, "_AbyssLvlMax" )->GetInteger();
pDungeonStruct->nAbyssNeedQuestID = pDungeonSox->GetFieldFromLablePtr( nTemp, "_AbyssQuestID" )->GetInteger();
static char *szDifficultStr[] = { "Easy", "Normal", "Hard", "VeryHard", "Nightmare" };
for( int i=0; i<5; i++ ) {
sprintf_s( szLabel, "_Recommend%sLevel", szDifficultStr[i] );
pDungeonStruct->nRecommandedLv[i] = pDungeonSox->GetFieldFromLablePtr( nTemp, szLabel )->GetInteger();
}
pDungeonStruct->nNeedItemID = pDungeonSox->GetFieldFromLablePtr( nTemp, "_NeedItemID" )->GetInteger();
pDungeonStruct->nNeedItemCount = pDungeonSox->GetFieldFromLablePtr( nTemp, "_NeedItemCount" )->GetInteger();
pDungeonStruct->bNeedVehicle = (pDungeonSox->GetFieldFromLablePtr( nTemp, "_Vehicle" )->GetInteger()) ? true : false;
pDungeonStruct->nNeedClearMissionID = pDungeonSox->GetFieldFromLablePtr( nTemp, "_NeedMission" )->GetInteger();
#if defined (PRE_SHARE_MAP_CLEARCOUNT)
//贗葬橫 蘋遴⑷ 奢嶸 褫暮檜 氈棻賊 ボ渡 薑爾 營撲薑
pDungeonStruct->nShareCountMapIndex = pDungeonSox->GetFieldFromLablePtr( nTemp, "_ShareCountMap" )->GetInteger();
if( pDungeonStruct->nShareCountMapIndex > 0 )
{
if( pSox->IsExistItem( pDungeonStruct->nShareCountMapIndex ) == false )
ASSERT(0); //葬模蝶 縑楝! <20>檣ビ晦 蔣啪 斜傖 避罹 幗萵梱?
//葬模蝶 螃盟賊 贗葬橫<E891AC>熱 橫箔癒 腎替棲 殮濰 寰腎朝啪 釭擊蛭.
pDungeonStruct->ShareMapSubType = (EWorldEnum::MapSubTypeEnum)pSox->GetFieldFromLablePtr( pDungeonStruct->nShareCountMapIndex, "_MapSubType" )->GetInteger();
pDungeonStruct->nMaxTryCount = pSox->GetFieldFromLablePtr( pDungeonStruct->nShareCountMapIndex, "_MaxClearCount" )->GetInteger();
pDungeonStruct->bExpandable = pSox->GetFieldFromLablePtr( pDungeonStruct->nShareCountMapIndex, "_Expandable" )->GetInteger() ? true : false;
}
#endif // #if defined (PRE_SHARE_MAP_CLEARCOUNT)
}
}
}
return pStruct;
}