BOOL CLController::AddLEComponent( CLEComponent* pComponent ) { // 군주 이벤트 생성 저장 if( GetQueryObject()->Execute( "uspAddLEComponent %d, %d, %d, %3.2f, %3.2f", g_appInfo.dwSys, pComponent->GetIdPlayer(), pComponent->GetTick(), pComponent->GetEFactor(), pComponent->GetIFactor() ) && GetQueryObject()->Fetch() ) return static_cast<BOOL>( GetQueryObject()->GetInt( "bResult" ) ); return FALSE; }
void CAccountTimeLimitDBCtrl::Handler( LPDB_OVERLAPPED_PLUS pov, DWORD dwCompletionKey ) { CAr ar( pov->lpBuf, pov->uBufSize ); switch( pov->nQueryMode ) { case QUERY_TIMELIMIT_LOAD: { DWORD dwPlayerId; int nPlayTime = -1; char szAccount[MAX_ACCOUNT]; ar >> dwPlayerId; ar.ReadString( szAccount, MAX_ACCOUNT ); CQuery* pQuery = GetQueryObject(); if( pQuery->Execute( "USP_AccountPlay_Select '%s'", szAccount ) ) { if( pQuery->Fetch() ) { nPlayTime = pQuery->GetInt( "PlayTime" ) * SEC( 1 ); // 초단위를 ms단위로 변환 DWORD dwLastPlayDate = static_cast<DWORD>( pQuery->GetInt( "PlayDate" ) ); int nYear = dwLastPlayDate/10000; dwLastPlayDate%=10000; int nMonth = dwLastPlayDate/100; dwLastPlayDate%=100; int nDay = dwLastPlayDate; CTime time( nYear, nMonth, nDay+1, 0, 0, 0 ); // 하루를 더한 값이 더 작으면 초기화.. if( time < CTime::GetCurrentTime() ) nPlayTime = 0; if( !prj.m_EventLua.IsTimeLimit() ) // 루아이벤트 스크립트에 베트남 제한 여부 설정 nPlayTime = 0; } } if( nPlayTime < 0 ) Error( "PlayTime is wrong - PlayerId : %d, PlayTime : %d", dwPlayerId, nPlayTime ); CDPTrans::GetInstance()->SendTimeLimitAck( dwPlayerId, nPlayTime, dwCompletionKey ); } break; case QUERY_TIMELIMIT_UPDATE: { char szAccount[MAX_ACCOUNT]; int nPlayTime; ar.ReadString( szAccount, MAX_ACCOUNT ); ar >> nPlayTime; nPlayTime /= SEC( 1 ); // ms 단위를 초단위로 변환 CTime time = CTime::GetCurrentTime(); DWORD dwLastDate = (time.GetYear()*10000) + (time.GetMonth()*100) + time.GetDay(); GetQueryObject()->Execute( "USP_AccountPlay_Update '%s', %d, %d", szAccount, dwLastDate, nPlayTime ); } break; } }
BOOL CLController::SetPledge( u_long idPlayer, const char* szPledge ) { // 공약 설정 저장 char szQuery[255] = { 0,}; IElection* pElection = m_pLord->GetElection(); sprintf( szQuery, "{call uspElectionSetPledge( %d, %d, %d, ? )}", g_appInfo.dwSys, pElection->GetId(), idPlayer ); SQLINTEGER cbLen = SQL_NTS; if( !GetQueryObject()->BindParameter( 1, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_VARCHAR, CCandidate::nMaxPledgeLen, 0, const_cast<char*>( szPledge ), 0, &cbLen ) ) return FALSE; return GetQueryObject()->Exec( szQuery ); }
int CLController::BeginVote( void ) { // 투표 시작 상태 저장 int nRequirement = -1; char szQuery[255] = { 0,}; IElection* pElection = m_pLord->GetElection(); sprintf( szQuery, "uspElectionBeginVote %d, %d", g_appInfo.dwSys, pElection->GetId() ); if( GetQueryObject()->Exec( szQuery ) && GetQueryObject()->Fetch() ) nRequirement = GetQueryObject()->GetInt( "nRequirement" ); return nRequirement; }
BOOL CLController::IncVote( u_long idPlayer, u_long idElector ) { // 투표 저장 // 이미 투표한 사용자면 FALSE 반환 char szQuery[255] = { 0,}; IElection* pElection = m_pLord->GetElection(); sprintf( szQuery, "uspElectionIncVote %d, %d, %d, %d", g_appInfo.dwSys, pElection->GetId(), idPlayer, idElector ); if( !GetQueryObject()->Exec( szQuery ) ) return FALSE; if( !GetQueryObject()->Fetch() ) return FALSE; return static_cast<BOOL>( GetQueryObject()->GetInt( "bResult" ) ); }
BOOL CLController::AddDeposit( u_long idPlayer, __int64 iDeposit, time_t tCreate ) { // 군주 입찰 저장 char szQuery[255] = { 0,}; IElection* pElection = m_pLord->GetElection(); sprintf( szQuery, "uspElectionAddDeposit %d, %d, %d, %I64d, %d", g_appInfo.dwSys, pElection->GetId(), idPlayer, iDeposit, tCreate ); return GetQueryObject()->Exec( szQuery ); }
BOOL CLController::BeginCandidacy( void ) { // 입후보 시작 상태 저장 char szQuery[255] = { 0,}; IElection* pElection = m_pLord->GetElection(); sprintf( szQuery, "uspElectionBeginCandidacy %d, %d", g_appInfo.dwSys, pElection->GetId() ); return GetQueryObject()->Exec( szQuery ); }
void CHousingDBCtrl::DeleteFurnitureList( DWORD dwPlayerId, HOUSINGINFO housingInfo ) { if( GetQueryObject()->Execute( "usp_Housing_Del '%02d', '%07d', %d", g_appInfo.dwSys, dwPlayerId, housingInfo.dwItemId ) ) { CHousingMng::GetInstance()->SetFurnitureList( dwPlayerId, housingInfo, FALSE ); CDPTrans::GetInstance()->SendHousingFurnitureList( dwPlayerId, housingInfo, FALSE, DPID_ALLPLAYERS ); } }
BOOL CCoupleController::DeletePropose( time_t t ) { if( !GetQueryObject()->Execute( "uspDeletePropose %d, %d", g_appInfo.dwSys, t ) ) { Error( "couldn't execute uspDeletePropose" ); return FALSE; } return TRUE; }
BOOL CCoupleController::Couple( u_long idProposer, u_long idTarget ) { if( !GetQueryObject()->Execute( "uspAddCouple %d, %d, %d", g_appInfo.dwSys, idProposer, idTarget ) ) { Error( "couldn't execute uspAddCouple" ); return FALSE; } return TRUE; }
BOOL CCoupleController::Decouple( u_long idPlayer ) { if( !GetQueryObject()->Execute( "uspDeleteCouple %d, %d", g_appInfo.dwSys, idPlayer ) ) { Error( "couldn't execute uspDeleteCouple" ); return FALSE; } return TRUE; }
BOOL CCoupleController::AddExperience( u_long idPlayer, int nExperience ) { if( !GetQueryObject()->Execute( "uspAddCoupleExperience %d, %d, %d", g_appInfo.dwSys, idPlayer, nExperience ) ) { Error( "couldn't execute uspAddCoupleExperience" ); return FALSE; } return TRUE; }
void CRainbowRaceDBCtrl::FailedUser( DWORD dwPlayerId ) { CQuery* pQuery = GetQueryObject(); char szQuery[QUERY_SIZE] = {0,}; // 레인보우레이스 시작시 접속안한 유저 실패처리 sprintf( szQuery, "RAINBOWRACE_STR 'U3', '%02d', %d, '%07d', 0", g_appInfo.dwSys, m_nTimes, dwPlayerId ); if( pQuery->Exec( szQuery ) == FALSE ) { WriteLog( "%s, %d\t%s", __FILE__, __LINE__, szQuery ); return; } }
void CRainbowRaceDBCtrl::UpdateWinnersLosers() { CQuery* pQuery = GetQueryObject(); char szQuery[QUERY_SIZE] = {0,}; // 랭킹예약자와 완주실패자를 저장한다. sprintf( szQuery, "RAINBOWRACE_STR 'U2', '%02d', %d, '0000000', 0", g_appInfo.dwSys, m_nTimes ); if( pQuery->Exec( szQuery ) == FALSE ) { WriteLog( "%s, %d\t%s", __FILE__, __LINE__, szQuery ); return; } }
void CRainbowRaceDBCtrl::UpdateRanking( DWORD dwPlayerId, int nRanking ) { CQuery* pQuery = GetQueryObject(); char szQuery[QUERY_SIZE] = {0,}; // 완주한 유저를 랭킹 예약한다. sprintf( szQuery, "RAINBOWRACE_STR 'U1', '%02d', %d, '%07d', %d", g_appInfo.dwSys, m_nTimes, dwPlayerId, nRanking ); if( pQuery->Exec( szQuery ) == FALSE ) { WriteLog( "%s, %d\t%s", __FILE__, __LINE__, szQuery ); return; } }
void CGuildHouseDBCtrl::RemoveGuildHouse( DWORD dwGuildId ) { if( GetQueryObject()->Execute( "usp_GuildHouse_Delete '%02d', '%06d'", g_appInfo.dwSys, dwGuildId ) ) GuildHouseMng->RemoveGuildHouse( dwGuildId ); BEFORESENDDUAL( arOut, PACKETTYPE_GUILDHOUSE_REMOVE, DPID_UNKNOWN, DPID_UNKNOWN ); arOut << dwGuildId; SEND( arOut, CDPTrans::GetInstance(), DPID_ALLPLAYERS ); }
void CRainbowRaceDBCtrl::Application( DWORD dwPlayerId ) { CQuery* pQuery = GetQueryObject(); char szQuery[QUERY_SIZE] = {0,}; // 등록한 신청자를 DB에 저장한다. sprintf( szQuery, "RAINBOWRACE_STR 'I1', '%02d', %d, '%07d', 0", g_appInfo.dwSys, m_nTimes, dwPlayerId ); if( pQuery->Exec( szQuery ) == FALSE ) { WriteLog( "%s, %d\t%s", __FILE__, __LINE__, szQuery ); return; } }
void CHousingDBCtrl::SetupFurniture( DWORD dwPlayerId, HOUSINGINFO housingInfo, DPID dpId ) { if( GetQueryObject()->Execute( "usp_Housing_Update '%02d', '%07d', %d, %d, %f, %f, %f, %f", g_appInfo.dwSys, dwPlayerId, housingInfo.dwItemId, housingInfo.bSetup, housingInfo.vPos.x, housingInfo.vPos.y, housingInfo.vPos.z, housingInfo.fAngle ) ) { CHousingMng::GetInstance()->SetupFurniture( dwPlayerId, housingInfo ); CDPTrans::GetInstance()->SendHousingSetupFurniture( dwPlayerId, housingInfo, dpId ); } else CDPTrans::GetInstance()->SendHousingDBFailed( dwPlayerId, NULL_ID, dpId ); }
void CHousingDBCtrl::SetVisitAllow( DWORD dwPlayerId, DWORD dwTargetId, BOOL bAllow, DPID dpId ) { if( GetQueryObject()->Execute( "%s '%02d', '%07d', '%07d'", bAllow? "usp_Housing_Visit_Insert": "usp_Housing_Visit_Delete", g_appInfo.dwSys, dwPlayerId, dwTargetId ) ) { CHousingMng::GetInstance()->SetVisitAllow( dwPlayerId, dwTargetId, bAllow ); CDPTrans::GetInstance()->SendHousingSetVisitAllow( dwPlayerId, dwTargetId, bAllow, dpId ); } else CDPTrans::GetInstance()->SendHousingDBFailed( dwPlayerId, NULL_ID, dpId ); }
BOOL CGuildHouseDBCtrl::ExcuteQuery( DWORD dwGuildId, CGuildHouseBase* pGuildHouse, int nPacketType, GH_Fntr_Info & gfi, int nIndex ) { switch( nPacketType ) { case GUILDHOUSE_PCKTTYPE_LISTUP: if( GetQueryObject()->Execute( "usp_GuildFurniture_Insert '%02d', '%06d', %d, %d, %d, %d,\ %f, %f, %f, %f", g_appInfo.dwSys, dwGuildId, GuildHouseMng->GetSeqNum() + 1, gfi.dwItemId, gfi.tKeepTime, static_cast<int>( gfi.bSetup ), gfi.vPos.x, gfi.vPos.y, gfi.vPos.z, gfi.fAngle ) ) { gfi.nSeqNum = GuildHouseMng->AddSeqNum(); return TRUE; } else return FALSE; case GUILDHOUSE_PCKTTYPE_LISTDROP: if( nIndex >= pGuildHouse->GetFurnitureListSize() ) return FALSE; gfi.nSeqNum = pGuildHouse->GetFurnitureInfo( nIndex ).nSeqNum; return GetQueryObject()->Execute( "usp_GuildFurniture_Delete '%02d', '%06d', %d", g_appInfo.dwSys, dwGuildId, gfi.nSeqNum ); case GUILDHOUSE_PCKTTYPE_SETUP: case GUILDHOUSE_PCKTTYPE_REMOVE: case GUILDHOUSE_PCKTTYPE_RESET: if( nIndex >= pGuildHouse->GetFurnitureListSize() ) return FALSE; gfi.nSeqNum = pGuildHouse->GetFurnitureInfo( nIndex ).nSeqNum; return GetQueryObject()->Execute( "usp_GuildFurniture_Update '%02d', '%06d', %d, %d, %d, \ %f, %f, %f, %f, %d", g_appInfo.dwSys, dwGuildId, gfi.nSeqNum, gfi.dwItemId, static_cast<int>( gfi.bSetup ), gfi.vPos.x, gfi.vPos.y, gfi.vPos.z, gfi.fAngle, gfi.tKeepTime ); case GUILDHOUSE_PCKTTYPE_UPKEEP: return GetQueryObject()->Execute( "usp_GuildHouse_Update '%02d', '%06d', %d", g_appInfo.dwSys, dwGuildId, gfi.tKeepTime ); case GUILDHOUSE_PCKTTYPE_EXPIRED: return GetQueryObject()->Execute( "usp_GuildHouse_Expired '%02d', '%06d'", g_appInfo.dwSys, dwGuildId ); }
void CHousingDBCtrl::InsertFurnitureList( DWORD dwPlayerId, DWORD dwItemId, DPID dpId ) { HOUSINGINFO housingInfo( dwItemId ); // 저장 정보를 만든다. // int n = sizeof(time_t); // time_t size가 4바이트로 나온다. // VS2003에서는 __int64라고 생각되는데..., 그래서 일단 __int64로 강제 casting if( GetQueryObject()->Execute( "usp_Housing_Insert '%02d', '%07d', %d, %I64d", g_appInfo.dwSys, dwPlayerId, housingInfo.dwItemId, static_cast<__int64>(housingInfo.tKeepTime) ) ) { CHousingMng::GetInstance()->SetFurnitureList( dwPlayerId, housingInfo, TRUE ); CDPTrans::GetInstance()->SendHousingFurnitureList( dwPlayerId, housingInfo, TRUE, dpId ); } else CDPTrans::GetInstance()->SendHousingDBFailed( dwPlayerId, housingInfo.dwItemId, dpId ); }
void CRainbowRaceDBCtrl::LoadRainbowRace( DPID dpId ) { CQuery* pQuery = GetQueryObject(); char szQuery[QUERY_SIZE] = {0,}; // m_nTimes 정보 가져오기.. 없으면 0 sprintf( szQuery, "RAINBOWRACE_STR 'S1', '%02d', 0, '0000000', 0", g_appInfo.dwSys ); if( pQuery->Exec( szQuery ) == FALSE ) { WriteLog( "%s, %d\t%s", __FILE__, __LINE__, szQuery ); return; } if( pQuery->Fetch() ) m_nTimes = pQuery->GetInt( "nTimes" ); if( m_nTimes == 0 ) { m_nTimes = 1; return; } // 신청자 목록 vector<DWORD> vec_dwNowPlayerId; sprintf( szQuery, "RAINBOWRACE_STR 'S2', '%02d', %d, '0000000', 0", g_appInfo.dwSys, m_nTimes ); if( pQuery->Exec( szQuery ) == FALSE ) { WriteLog( "%s, %d\t%s", __FILE__, __LINE__, szQuery ); return; } while( pQuery->Fetch() ) vec_dwNowPlayerId.push_back( static_cast<DWORD>( pQuery->GetInt( "m_idPlayer" ) ) ); if( vec_dwNowPlayerId.size() == 0 ) // 현재 신청자가 없으면 다음 회 진행... m_nTimes++; // 이전 대회 랭킹 vector<DWORD> vec_dwPrevRanking; if( m_nTimes > 1 ) // 현재가 2회 이상일때만..( 1회 이상 진행했을 경우 ) { sprintf( szQuery, "RAINBOWRACE_STR 'S3', '%02d', %d, '0000000', 0", g_appInfo.dwSys, m_nTimes ); if( pQuery->Exec( szQuery ) == FALSE ) { WriteLog( "%s, %d\t%s", __FILE__, __LINE__, szQuery ); return; } while( pQuery->Fetch() ) vec_dwPrevRanking.push_back( static_cast<DWORD>( pQuery->GetInt( "m_idPlayer" ) ) ); } CDPTrans::GetInstance()->SendRainbowRaceInfo( vec_dwNowPlayerId, vec_dwPrevRanking, dpId ); }
void CHousingDBCtrl::LoadHousingInfo( DWORD dwPlayerId, DPID dpId ) { CHousing* pHousing = CHousingMng::GetInstance()->GetHousing( dwPlayerId ); if( !pHousing ) { pHousing = CHousingMng::GetInstance()->CreateHousing( dwPlayerId ); if( !pHousing ) // 생성 실패시 그냥 리턴.. return; // DB 로딩... CQuery* pQuery = GetQueryObject(); if( pQuery->Execute( "usp_Housing_Load '%02d', '%07d'", g_appInfo.dwSys, dwPlayerId ) ) { while( pQuery->Fetch() ) { HOUSINGINFO housingInfo; housingInfo.dwItemId = static_cast<DWORD>( pQuery->GetInt( "ItemIndex" ) ); housingInfo.tKeepTime = static_cast<time_t>( pQuery->GetInt64( "tKeepTime" ) ); housingInfo.bSetup = static_cast<BOOL>( pQuery->GetInt( "bSetup" ) ); housingInfo.vPos.x = pQuery->GetFloat( "x_Pos" ); housingInfo.vPos.y = pQuery->GetFloat( "y_Pos" ); housingInfo.vPos.z = pQuery->GetFloat( "z_Pos" ); housingInfo.fAngle = pQuery->GetFloat( "fAngle" ); ItemProp* pItemProp = prj.GetItemProp( housingInfo.dwItemId ); if( pItemProp && pItemProp->dwItemKind1 == IK1_HOUSING ) pHousing->SetFurnitureList( housingInfo, TRUE ); } if( pQuery->MoreResults() ) { while( pQuery->Fetch() ) pHousing->SetVisitAllow( pQuery->GetInt( "f_idPlayer" ), TRUE ); } } } // 하우징 정보를 월드서버에 전달... CDPTrans::GetInstance()->SendHousingLoadInfo( dwPlayerId, pHousing, dpId ); }
void CGuildHouseDBCtrl::CreateGuildHouse( CAr & ar, DPID dpId ) { DWORD dwPlayerId, dwGuildId; ar >> dwPlayerId >> dwGuildId; BOOL bResult = FALSE; CQuery* pQuery = GetQueryObject(); BEFORESENDDUAL( arCreate, PACKETTYPE_GUILDHOUSE_BUY, DPID_UNKNOWN, DPID_UNKNOWN ); { arCreate << dwPlayerId << dwGuildId; CGuildHouseBase* pGuildHouse = GuildHouseMng->MakeGuildHouse( dwGuildId, WI_GUILDHOUSE_SMALL ); if( pGuildHouse ) { pGuildHouse->SetUpkeeptime( time_null() + ( UPKEEP_DAY_TIME * 7 ) ); // 기본 유지기간을 제공한다. if( pQuery->Execute( "usp_GuildHouse_Insert '%02d', '%06d', %d, %d", g_appInfo.dwSys, dwGuildId, WI_GUILDHOUSE_SMALL, pGuildHouse->GetUpkeepTime() ) // DB에 추가 성공 && GuildHouseMng->AddGuildHouse( dwGuildId, pGuildHouse ) ) { arCreate << TRUE; dpId = DPID_ALLPLAYERS; // 모든 월드 서버로 전송한다. GH_Fntr_Info gfi( II_GHOU_FUR_NPC_TELEPORTER, TRUE, pGuildHouse->GetTeleporterPos(), 0.0f, ( UPKEEP_DAY_TIME * 7 ) ); if( ExcuteQuery( dwGuildId, pGuildHouse, GUILDHOUSE_PCKTTYPE_LISTUP, gfi, NULL_ID ) ) pGuildHouse->OnGuildHousePacket( GUILDHOUSE_PCKTTYPE_LISTUP, gfi, NULL_ID ); pGuildHouse->SerializeAllInfo( arCreate ); } else { arCreate << FALSE; SAFE_DELETE( pGuildHouse ); } } else arCreate << FALSE; } SEND( arCreate, CDPTrans::GetInstance(), dpId ); }
BOOL CLController::InitializeLEvent( void ) { // 군주 이벤트 초기화 저장 return GetQueryObject()->Execute( "uspInitializeLEvent %d", g_appInfo.dwSys ); }
BOOL CLController::EndVote( u_long idPlayer ) { // 투표 종료 상태 저장 IElection* pElection = m_pLord->GetElection(); return GetQueryObject()->Execute( "uspElectionEndVote %d, %d, %d, %s", g_appInfo.dwSys, pElection->GetId(), idPlayer, (LPCSTR)CTElection::ttos( pElection->GetNextBegin() ) ); }
BOOL CLController::UpdateLordEventTick( CLEComponent* pComponent ) { // 군주 이벤트 남은 시간 저장 return GetQueryObject()->Execute( "uspLordEventTick %d, %d, %d", g_appInfo.dwSys, pComponent->GetIdPlayer(), pComponent->GetTick() ); }
void CGuildHouseDBCtrl::Handler( LPDB_OVERLAPPED_PLUS pov, DWORD dwCompletionKey ) { CAr ar( pov->lpBuf, pov->uBufSize ); switch( pov->nQueryMode ) { case GUILDHOUSE_LOAD: if( !LoadGuildHouse() ) AfxMessageBox( "GuildHouse Load Failed!!!" ); break; case GUILDHOUSE_SEND: SendGuildHouse( dwCompletionKey ); #ifdef __GUILD_HOUSE_MIDDLE SendGuildHouseTenderInfo( dwCompletionKey ); #endif // GUILDHOUSE_SEND break; case GUILDHOUSE_CREATE: CreateGuildHouse( ar, dwCompletionKey ); break; case GUILDHOUSE_REMOVE: RemoveGuildHouse( dwCompletionKey ); break; case GUILDHOUSE_DEFAULT_PACKET: RunDefaultPacket( ar, dwCompletionKey ); break; case GUILDHOUSE_SAVE_RESTPOINT: DWORD dwPlayerId; int nRestPoint; time_t tLogOut; ar >> dwPlayerId >> nRestPoint >> tLogOut; GetQueryObject()->Execute( "usp_RestPoint_Update '%02d', '%07d', %d, %d", g_appInfo.dwSys, dwPlayerId, nRestPoint, tLogOut ); break; #ifdef __GUILD_HOUSE_MIDDLE case GUILDHOUSE_TENDER_JOIN: { JoinGuildHouseTender( ar, dwCompletionKey ); } break; case GUILDHOUSE_GRADE_UPDATE: { UpgradeGuildHouseGrade( ar, dwCompletionKey ); } break; case GUILDHOUSE_LEVEL_UPDATE: { UpgradeGuildHouseLevel( ar, dwCompletionKey ); } break; case GUILDHOUSE_EXPIRED: { UpdateGuildHouseExpired( ar ); } break; #endif // __GUILD_HOUSE_MIDDLE } }
BOOL CLController::UpdateLordSkillTick( CLordSkillComponent* pSkill, int nTick ) { // 군주 스킬 재사용 대기 시간 저장 return GetQueryObject()->Execute( "uspLordSkillTick %d, %d, %d", g_appInfo.dwSys, pSkill->GetId(), nTick ); }