diff --git a/Lib/Release/AuKbHook.exp b/Lib/Release/AuKbHook.exp index f7902d9f..c0a5174c 100644 Binary files a/Lib/Release/AuKbHook.exp and b/Lib/Release/AuKbHook.exp differ diff --git a/Lib/Release/AuKbHook.lib b/Lib/Release/AuKbHook.lib index ceccbeee..9dc85ba5 100644 Binary files a/Lib/Release/AuKbHook.lib and b/Lib/Release/AuKbHook.lib differ diff --git a/Lib/Release/SoundLibrary.lib b/Lib/Release/SoundLibrary.lib index 1c40371a..1be5fee8 100644 Binary files a/Lib/Release/SoundLibrary.lib and b/Lib/Release/SoundLibrary.lib differ diff --git a/Modules/AClient/AgcmUICashMall/AgcmUICashMall.cpp b/Modules/AClient/AgcmUICashMall/AgcmUICashMall.cpp index da00b0d3..24ebc10c 100644 --- a/Modules/AClient/AgcmUICashMall/AgcmUICashMall.cpp +++ b/Modules/AClient/AgcmUICashMall/AgcmUICashMall.cpp @@ -582,7 +582,6 @@ BOOL AgcmUICashMall::RefreshCashEdit() #ifdef _AREA_GLOBAL_ CashInfoGlobal pCash; - m_pagpmBillInfo->SetCashGlobal(m_pcsAgcmCharacter->GetSelfCharacter(), 100000, 100000); m_pagpmBillInfo->GetCashGlobal(m_pcsAgcmCharacter->GetSelfCharacter(), pCash.m_WCoin, pCash.m_PCoin); szBuffer.Format("%s : %d", m_pcsAgcmUIManager2->GetUIMessage(AGCMUIMESSAGE_CASHMALL_C_CASH), (INT64)pCash.m_WCoin); diff --git a/Modules/AClient/AgcmUIOption/AgcmUIOption.cpp b/Modules/AClient/AgcmUIOption/AgcmUIOption.cpp index 6998f9f7..ed4af589 100644 --- a/Modules/AClient/AgcmUIOption/AgcmUIOption.cpp +++ b/Modules/AClient/AgcmUIOption/AgcmUIOption.cpp @@ -3330,6 +3330,10 @@ BOOL AgcmUIOption::LoadFromINI(char* szFile) { csStream.GetValue(&m_bAutolootOwn); } + else if(!strcmp(szValueName, "REF_AL")) + { + csStream.GetValue(&m_bIsAutoPickItem); + } else if(!strcmp(szValueName, "REF_PIN")) { csStream.GetValue(&m_bRefusePartyIn); @@ -3494,6 +3498,7 @@ BOOL AgcmUIOption::SaveToINI(char* szFileName) if(!csStream.WriteValue("REF_TRADE", m_bRefuseTrade)) return FALSE; if(!csStream.WriteValue("REF_DXP", m_bDisableXP)) return FALSE; if(!csStream.WriteValue("REF_ALOWN", m_bAutolootOwn)) return FALSE; + if(!csStream.WriteValue("REF_AL", m_bIsAutoPickItem)) return FALSE; if(!csStream.WriteValue("REF_PIN", m_bRefusePartyIn)) return FALSE; if(!csStream.WriteValue("REF_GIN", m_bRefuseGuildIn)) return FALSE; if(!csStream.WriteValue("REF_GBAT", m_bRefuseGuildBattle)) return FALSE; @@ -3849,8 +3854,9 @@ VOID AgcmUIOption::SendOptionFlag() if (m_bRefuseGuildIn) lOptionFlag = m_pcsAgpmCharacter->SetOptionFlag(lOptionFlag, AGPDCHAR_OPTION_REFUSE_GUILD_IN); if (m_bRefuseGuildRelation) lOptionFlag = m_pcsAgpmCharacter->SetOptionFlag(lOptionFlag, AGPDCHAR_OPTION_REFUSE_GUILD_RELATION); if (m_bRefuseBuddy) lOptionFlag = m_pcsAgpmCharacter->SetOptionFlag(lOptionFlag, AGPDCHAR_OPTION_REFUSE_BUDDY); + if (m_bIsAutoPickItem) lOptionFlag = m_pcsAgpmCharacter->SetOptionFlag(lOptionFlag, AGPDCHAR_OPTION_AUTO_PICKUP_ONOFF); if (m_bDisableXP) lOptionFlag = m_pcsAgpmCharacter->SetOptionFlag(lOptionFlag, AGPDCHAR_OPTION_DISABLE_XP); - if (m_bAutolootOwn) lOptionFlag = m_pcsAgpmCharacter->SetOptionFlag(lOptionFlag, AGPDCHAR_OPTION_AUTO_PICKUP_ONOFF); + if (m_bAutolootOwn) lOptionFlag = m_pcsAgpmCharacter->SetOptionFlag(lOptionFlag, AGPDCHAR_OPTION_AUTO_PICKUP_OWN_ONLY); m_pcsAgcmCharacter->SendPacketOptionFlag(pcsSelfCharacter, lOptionFlag); } diff --git a/Modules/APublic/AgpmBillInfo/AgpmBillInfo.cpp b/Modules/APublic/AgpmBillInfo/AgpmBillInfo.cpp index ad076358..ce600fb2 100644 --- a/Modules/APublic/AgpmBillInfo/AgpmBillInfo.cpp +++ b/Modules/APublic/AgpmBillInfo/AgpmBillInfo.cpp @@ -181,13 +181,11 @@ BOOL AgpmBillInfo::IsPCBang(AgpdCharacter *pcsCharacter) BOOL AgpmBillInfo::SetCashGlobal(AgpdCharacter* pcsCharacter, double WCoin, double PCoin) { if (!pcsCharacter){ - printf("SetCashGlobal 1"); return FALSE; } AgpdBillInfo *pcsAttachData = GetADCharacter(pcsCharacter); if(!pcsAttachData){ - printf("SetCashGlobal 2"); return FALSE; } diff --git a/Modules/APublic/AgpmCashMall/AgpdCashMall.h b/Modules/APublic/AgpmCashMall/AgpdCashMall.h index 183ccea1..f2b2742e 100644 --- a/Modules/APublic/AgpmCashMall/AgpdCashMall.h +++ b/Modules/APublic/AgpmCashMall/AgpdCashMall.h @@ -2,7 +2,7 @@ #include "ApDefine.h" -#define AGPMCASHMALL_MIN_INTERVAL_REFRESH_CASH 1000 +#define AGPMCASHMALL_MIN_INTERVAL_REFRESH_CASH 100 typedef struct _AgpdCashMall { diff --git a/Modules/APublic/AgpmCashMall/AgpmCashMall.cpp b/Modules/APublic/AgpmCashMall/AgpmCashMall.cpp index ac67804f..39d42858 100644 --- a/Modules/APublic/AgpmCashMall/AgpmCashMall.cpp +++ b/Modules/APublic/AgpmCashMall/AgpmCashMall.cpp @@ -24,6 +24,15 @@ AgpmCashMall::AgpmCashMall() AUTYPE_END, 0 ); + // NOT THIS ONE, NEED TO REMOVE I THINK, OR MAYBE REMOVE THE OTHER + m_csPacketRequestCash.SetFlagLength(sizeof(INT64)); + m_csPacketRequestCash.SetFieldType( + AUTYPE_INT8, 1, // operation + AUTYPE_CHAR, AGPACHARACTER_MAX_ID_STRING + 1, // Game ID + AUTYPE_INT32, 1, // cid + AUTYPE_END, 0 + ); + m_lIndexAttachData = 0; m_bUseCashMall = TRUE; diff --git a/Modules/APublic/AgpmCashMall/AgpmCashMall.h b/Modules/APublic/AgpmCashMall/AgpmCashMall.h index f08368a0..6905033a 100644 --- a/Modules/APublic/AgpmCashMall/AgpmCashMall.h +++ b/Modules/APublic/AgpmCashMall/AgpmCashMall.h @@ -183,6 +183,7 @@ class AgpmCashMall : public ApModule public: AuPacket m_csPacket; + AuPacket m_csPacketRequestCash; public: AgpmCashMall(); diff --git a/Modules/APublic/AgpmSiegeWar/AgpmSiegeWarApplication.cpp b/Modules/APublic/AgpmSiegeWar/AgpmSiegeWarApplication.cpp index aaade465..ea47bb7c 100644 --- a/Modules/APublic/AgpmSiegeWar/AgpmSiegeWarApplication.cpp +++ b/Modules/APublic/AgpmSiegeWar/AgpmSiegeWarApplication.cpp @@ -28,13 +28,13 @@ BOOL AgpmSiegeWar::CheckGuildRequirement(AgpdGuild *pcsGuild) */ // ±æµå Àοø 20ÀÎ ÀÌ»ó. - if (m_pcsAgpmGuild->GetAllMemberCount(pcsGuild) < AGPMSIEGEWAR_GUILD_MEMBER_COUNT_REQUIREMENT) - return FALSE; + //if (m_pcsAgpmGuild->GetAllMemberCount(pcsGuild) < AGPMSIEGEWAR_GUILD_MEMBER_COUNT_REQUIREMENT) + //return FALSE; //±æµå »ý¼º ÈÄ 14ÀÏ ÀÌ»ó - UINT32 ulCurrentTime = AuTimeStamp::GetCurrentTimeStamp(); - if (ulCurrentTime - pcsGuild->m_lCreationDate < AGPMSIEGEWAR_GUILD_CREATE_TIME_REQUIREMENT) - return FALSE; + //UINT32 ulCurrentTime = AuTimeStamp::GetCurrentTimeStamp(); + //if (ulCurrentTime - pcsGuild->m_lCreationDate < AGPMSIEGEWAR_GUILD_CREATE_TIME_REQUIREMENT) + //return FALSE; return TRUE; } diff --git a/Modules/AServer/AgsmCashMall/AgsmCashMall.cpp b/Modules/AServer/AgsmCashMall/AgsmCashMall.cpp index 7a821132..5284b6b5 100644 --- a/Modules/AServer/AgsmCashMall/AgsmCashMall.cpp +++ b/Modules/AServer/AgsmCashMall/AgsmCashMall.cpp @@ -1,6 +1,7 @@ #include "AgsmCashMall.h" #include "AgsmSystemMessage.h" #include "AgsmBillingChina.h" +#include "AgppBillInfo.h" AgsmCashMall::AgsmCashMall() { @@ -147,7 +148,6 @@ BOOL AgsmCashMall::CBRequestBuyItem(PVOID pData, PVOID pClass, PVOID pCustData) BOOL AgsmCashMall::CBRefreshCash(PVOID pData, PVOID pClass, PVOID pCustData) { - printf("Refreshing cash...\n"); if (!pData || !pClass) return FALSE; @@ -156,30 +156,48 @@ BOOL AgsmCashMall::CBRefreshCash(PVOID pData, PVOID pClass, PVOID pCustData) AgpdCashMall *pcsAttachData = pThis->m_pcsAgpmCashMall->GetADCharacter(pcsCharacter); if (!pcsAttachData){ - printf("1"); return FALSE; } if (pcsAttachData->m_ulLastRefreshCashTimeMsec + AGPMCASHMALL_MIN_INTERVAL_REFRESH_CASH > pThis->GetClockCount()){ - printf("2"); return TRUE; } pcsAttachData->m_ulLastRefreshCashTimeMsec = pThis->GetClockCount() + AGPMCASHMALL_MIN_INTERVAL_REFRESH_CASH; - // request to billing server + // Request to billing server. + INT8 cOperation = AGPMCASH_OPERATION_REFRESH_CASH; + INT16 nPacketLength = 0; + PVOID pvPacket = pThis->m_pcsAgpmCashMall->m_csPacketRequestCash.MakePacket( + TRUE, + &nPacketLength, + AGPMCASHMALL_PACKET_TYPE, + &cOperation, + &pcsCharacter->m_szID, + &pcsCharacter->m_lID + ); + + BOOL bResult = pThis->SendPacket(pvPacket, nPacketLength, pThis->_GetCharacterNID(pcsCharacter)); + pThis->m_pcsAgpmCashMall->m_csPacketRequestCash.FreePacket(pvPacket); - CashInfoGlobal pCash; - pThis->m_pcsAgpmBillInfo->GetCashGlobal(pcsCharacter, pCash.m_WCoin, pCash.m_PCoin); - printf("Increasing from %f to %f\n", pCash.m_WCoin, 2500.0); - pThis->m_pcsAgpmBillInfo->SetCashGlobal(pcsCharacter, 2500.0, 0); + return bResult; +} - pThis->m_pcsAgpmBillInfo->GetCashGlobal(pcsCharacter, pCash.m_WCoin, pCash.m_PCoin); - printf("Now %f\n", pCash.m_WCoin); +// Helper +//=============================================== +// +UINT32 AgsmCashMall::_GetCharacterNID(INT32 lCID) + { + ASSERT(NULL != m_pAgsmCharacter); + return m_pcsAgsmCharacter->GetCharDPNID(lCID); + } - return TRUE; -} +UINT32 AgsmCashMall::_GetCharacterNID(AgpdCharacter *pAgpdCharacter) + { + ASSERT(NULL != m_pAgsmCharacter); + return m_pcsAgsmCharacter->GetCharDPNID(pAgpdCharacter); + } BOOL AgsmCashMall::CBCheckListVersion(PVOID pData, PVOID pClass, PVOID pCustData) { @@ -291,7 +309,7 @@ INT32 AgsmCashMall::CheckBuyRequirement(AgpdCharacter *pcsCharacter, INT32 lProd return AGPMCASH_BUY_RESULT_NOT_ENOUGH_CASH; } #else - /*CashInfoGlobal pCash; + CashInfoGlobal pCash; m_pcsAgpmBillInfo->GetCashGlobal(pcsCharacter, pCash.m_WCoin, pCash.m_PCoin); switch(lType) @@ -311,7 +329,7 @@ INT32 AgsmCashMall::CheckBuyRequirement(AgpdCharacter *pcsCharacter, INT32 lProd } break; default: return AGPMCASH_BUY_RESULT_FAIL; - }*/ + } #endif if (!m_pcsAgpmItem->IsAnyEmptyCashInventory(pcsCharacter)) @@ -418,6 +436,23 @@ BOOL AgsmCashMall::ProcessBuyItem(AgpdCharacter *pcsCharacter, INT32 lProductID, pcsItem->m_lStatusFlag |= AGPMITEM_STATUS_CASH_PPCARD; } + // Deduct credits + CashInfoGlobal pCash; + m_pcsAgpmBillInfo->GetCashGlobal(pcsCharacter, pCash.m_WCoin, pCash.m_PCoin); + switch (lType) { + case AGPMCASHMALL_TYPE_WCOIN: + pCash.m_WCoin = pCash.m_WCoin - pCashItemInfo->m_llPrice; + break; + case AGPMCASHMALL_TYPE_WCOIN_PPCARD: + pCash.m_PCoin = pCash.m_PCoin - pCashItemInfo->m_llPrice; + break; + } + + // Call refresh instead maybe? + m_pcsAgpmBillInfo->SetCashGlobal(pcsCharacter, pCash.m_WCoin, pCash.m_PCoin); + PACKET_BILLINGINFO_CASHINFO pPacket(pcsCharacter->m_lID, pCash.m_WCoin, pCash.m_PCoin); + SendPacketUser(pPacket, m_pcsAgsmCharacter->GetCharDPNID(pcsCharacter)); + // insert item into cash inventory if (!m_pcsAgpmItem->AddItemToCashInventory(pcsCharacter, pcsItem)) { diff --git a/Modules/AServer/AgsmCashMall/AgsmCashMall.h b/Modules/AServer/AgsmCashMall/AgsmCashMall.h index 2b183985..02cc815f 100644 --- a/Modules/AServer/AgsmCashMall/AgsmCashMall.h +++ b/Modules/AServer/AgsmCashMall/AgsmCashMall.h @@ -5,6 +5,7 @@ #include "AgsmItemManager.h" #include "AgsmCharManager.h" #include "AgsmBilling.h" +#include "AgppBillInfo.h" class AgsmSystemMessage; class CCallBackFunc; @@ -50,4 +51,9 @@ class AgsmCashMall : public AgsModule { BOOL ProcessBuyItem(AgpdCharacter *pcsCharacter, INT32 lProductID, UINT8 ucMallListVersion, INT32 lType); BOOL ProcessBuyItemResult(AgpdCharacter *pcsCharacter, AgsdBillingItem *pcsBilling); BOOL SendMallProductList(AgpdCharacter *pcsCharacter, INT32 lTab); + +protected: + // Helper + UINT32 _GetCharacterNID(INT32 lCID); + UINT32 _GetCharacterNID(AgpdCharacter *pAgpdCharacter); }; \ No newline at end of file diff --git a/Modules/AServer/AgsmCharManager/AgsmCharManager.cpp b/Modules/AServer/AgsmCharManager/AgsmCharManager.cpp index 9bdcd064..e952e60e 100644 --- a/Modules/AServer/AgsmCharManager/AgsmCharManager.cpp +++ b/Modules/AServer/AgsmCharManager/AgsmCharManager.cpp @@ -1110,8 +1110,6 @@ INT16 AgsmCharManager::EnterGameWorld(AgpdCharacter *pcsCharacter, BOOL bIsCheck */ //m_pagsmCharacter->CheckRecvCharList(pcsCharacter->m_lID); - - m_pagpmBillInfo->SetCashGlobal(pcsCharacter, 10000, 0); // ÀÌ character·Î °ÔÀÓÀÌ ÁøÇàµÉ°Å¶ó´Â ÆÐŶÀ» ³¯·ÁÁØ´Ù. if (!SendCharacterSettingOK(pcsCharacter, pcsAgsdCharacter->m_dpnidCharacter)) diff --git a/Modules/AServer/AgsmCharManager/AgsmCharManager.h b/Modules/AServer/AgsmCharManager/AgsmCharManager.h index d5f3e49a..6f87963a 100644 --- a/Modules/AServer/AgsmCharManager/AgsmCharManager.h +++ b/Modules/AServer/AgsmCharManager/AgsmCharManager.h @@ -18,6 +18,7 @@ Last Update: 2002. 08. 23 #include "ApmMap.h" #include "AgpmFactors.h" #include "AgpmCharacter.h" +#include "AgpmCashMall.h" #include "AgpdCharacter.h" #include "AgpmItem.h" #include "AgpmEventBinding.h" diff --git a/Modules/AServer/AgsmDropItem2/AgsmDropItem2.cpp b/Modules/AServer/AgsmDropItem2/AgsmDropItem2.cpp index e32acc90..89509b5b 100644 --- a/Modules/AServer/AgsmDropItem2/AgsmDropItem2.cpp +++ b/Modules/AServer/AgsmDropItem2/AgsmDropItem2.cpp @@ -359,7 +359,7 @@ BOOL AgsmDropItem2::CBDropItem(PVOID pData, PVOID pClass, PVOID pCustData) return TRUE; } - BOOL autolootOwn = ((AgpmCharacter *) pcsDropInfo->m_pcsFirstLooter)->IsOptionFlag(((AgpdCharacter *) pcsDropInfo->m_pcsFirstLooter), AGPDCHAR_OPTION_AUTO_PICKUP_OWN_ONLY) == TRUE; + BOOL autolootOwnConfig = ((AgpmCharacter *) pcsDropInfo->m_pcsFirstLooter)->IsOptionFlag(((AgpdCharacter *) pcsDropInfo->m_pcsFirstLooter), AGPDCHAR_OPTION_AUTO_PICKUP_OWN_ONLY) == TRUE; INT32 lCharClass = pThis->m_pcsAgpmFactors->GetClass(&((AgpdCharacter *) pcsDropInfo->m_pcsFirstLooter)->m_csFactor); INT32 lCharRace = pThis->m_pcsAgpmFactors->GetRace(&((AgpdCharacter *) pcsDropInfo->m_pcsFirstLooter)->m_csFactor); @@ -369,14 +369,22 @@ BOOL AgsmDropItem2::CBDropItem(PVOID pData, PVOID pClass, PVOID pCustData) pThis->m_pcsAgsmCharacter->IsAutoPickup((AgpdCharacter *) pcsDropInfo->m_pcsFirstLooter) && pcsItem->m_pcsItemTemplate->m_lID != 4608) { - if ( - autolootOwn && - !( - pThis->m_pcsAgpmFactors->CheckClass((AuCharClassType)lCharClass, &pcsItem->m_csRestrictFactor) && - pThis->m_pcsAgpmFactors->CheckRace ((AuRaceType) lCharRace, &pcsItem->m_csRestrictFactor) && - pThis->m_pcsAgpmFactors->GetClass (&pcsItem->m_csRestrictFactor) != AUCHARCLASS_TYPE_NONE - ) - ) { + /*printf( + "Dropping %s. Class %d, Race: %d, Rank: %d\n", + pcsItem->m_pcsItemTemplate->m_szName, + pThis->m_pcsAgpmFactors->GetClass (&pcsItem->m_csRestrictFactor), + pThis->m_pcsAgpmFactors->GetRace (&pcsItem->m_csRestrictFactor), + pcsADItemTemplate->m_lDropRank + );*/ + + BOOL notForMe = !( + pThis->m_pcsAgpmFactors->CheckClass((AuCharClassType)lCharClass, &pcsItem->m_csRestrictFactor) && + pThis->m_pcsAgpmFactors->CheckRace ((AuRaceType) lCharRace, &pcsItem->m_csRestrictFactor) + ); + + BOOL classless = pThis->m_pcsAgpmFactors->GetClass (&pcsItem->m_csRestrictFactor) == AUCHARCLASS_TYPE_NONE; + + if (autolootOwnConfig && notForMe && !classless) { return pThis->DropItemToField(pcsDropInfo->m_pcsDropCharacter, pcsDropInfo->m_pcsFirstLooter, pcsItem); } diff --git a/Modules/AServer/AgsmRelay2/AgsdRelay2.h b/Modules/AServer/AgsmRelay2/AgsdRelay2.h index d1560463..b7c9aa30 100644 --- a/Modules/AServer/AgsmRelay2/AgsdRelay2.h +++ b/Modules/AServer/AgsmRelay2/AgsdRelay2.h @@ -112,6 +112,7 @@ typedef enum _eAgsmRelay2Param AGSMRELAY_PARAM_COUPON, // 82. Coupon AGSMRELAY_PARAM_SERVERMOVE, // 83. Ư¼ºÈ­ ¼­¹ö ¼­¹öÀ̵¿ //JK_Ư¼ºÈ­¼­¹ö + AGSMRELAY_PARAM_REQUEST_CASH, // 84. } eAgsmRelay2Param; @@ -573,6 +574,28 @@ class AgsdRelay2CashItemBuyList : public AgsdDBParam, public ApMemory + { + public: + CHAR m_szAccountID[AGSMACCOUNT_MAX_ACCOUNT_NAME + 1]; + + protected: + BOOL SetParamSelect(AuStatement *pStatement); + BOOL SetParamUpdate(AuStatement *pStatement); + BOOL SetParamInsert(AuStatement *pStatement); + BOOL SetParamExecute(AuStatement *pStatement); + + public: + AgsdRelay2RequestCash(); + virtual ~AgsdRelay2RequestCash() {} + virtual void Release() { delete this; } + + virtual void Dump(CHAR *pszOp); + }; + // // ========== Wanted Criminal ========== // diff --git a/Modules/AServer/AgsmRelay2/AgsmRelay2.cpp b/Modules/AServer/AgsmRelay2/AgsmRelay2.cpp index 39054196..dfa9a362 100644 --- a/Modules/AServer/AgsmRelay2/AgsmRelay2.cpp +++ b/Modules/AServer/AgsmRelay2/AgsmRelay2.cpp @@ -136,6 +136,7 @@ BOOL AgsmRelay2::OnAddModule() #endif // get related modules + m_pAgpmBillInfo = (AgpmBillInfo *) GetModule(_T("AgpmBillInfo")); m_pAgpmConfig = (AgpmConfig *) GetModule(_T("AgpmConfig")); m_pAgpmCharacter = (AgpmCharacter *) GetModule(_T("AgpmCharacter")); m_pAgsmCharacter = (AgsmCharacter *) GetModule(_T("AgsmCharacter")); @@ -162,6 +163,7 @@ BOOL AgsmRelay2::OnAddModule() m_pAgpmMailBox = (AgpmMailBox *) GetModule(_T("AgpmMailBox")); m_pAgsmMailBox = (AgsmMailBox *) GetModule(_T("AgsmMailBox")); m_pAgsmCashMall = (AgsmCashMall *) GetModule(_T("AgsmCashMall")); + m_pAgpmCashMall = (AgpmCashMall *) GetModule(_T("AgpmCashMall")); m_pAgsmReturnToLogin = (AgsmReturnToLogin *) GetModule(_T("AgsmReturnToLogin")); m_pAgsmWantedCriminal = (AgsmWantedCriminal *) GetModule(_T("AgsmWantedCriminal")); m_pAgsmSiegeWar = (AgsmSiegeWar *) GetModule(_T("AgsmSiegeWar")); @@ -423,6 +425,12 @@ BOOL AgsmRelay2::OnAddModule() } + if (m_pAgpmCashMall) + { + if (!m_pAgpmCashMall->SetCallbackRefreshCash(CBRefreshCash, this)) + return FALSE; + } + if (m_pAgsmWantedCriminal) { if (!m_pAgsmWantedCriminal->SetCallbackSelect(CBWantedCriminalSelect, this)) @@ -718,6 +726,10 @@ BOOL AgsmRelay2::OnReceive(UINT32 ulType, PVOID pvPacket, INT16 nSize, UINT32 ul OnParamServerMove((PACKET_HEADER*)pvPacket, ulNID); break; + case AGSMRELAY_PARAM_REQUEST_CASH: + OnParamRequestCash(nParam, pvPacketEmb, ulNID, (PACKET_HEADER*)pvPacket); + break; + default: OutputDebugString("!!! Error : Unknown Packet Received in AgsmRelay2::OnReceive()\n"); break; @@ -949,6 +961,11 @@ BOOL AgsmRelay2::SetCallbackLordGuard(ApModuleDefaultCallBack pfCallback, PVOID return SetCallback(AGSMRELAY_PARAM_LORDGUARD, pfCallback, pClass); } +BOOL AgsmRelay2::SetCallbackRefreshCash(ApModuleDefaultCallBack pfCallback, PVOID pClass) + { + return SetCallback(AGSMRELAY_PARAM_REQUEST_CASH, pfCallback, pClass); + } + @@ -1176,6 +1193,30 @@ BOOL AgsmRelay2::EnableBufferingSend() +BOOL AgsmRelay2::CBRefreshCash(PVOID pData, PVOID pClass, PVOID pCustData) +{ + if (!pClass || !pData) + return FALSE; + + AgsmRelay2 *pThis = (AgsmRelay2 *) pClass; + AgpdCharacter *pcsCharacter = (AgpdCharacter *) pData; + + INT16 nPacketLength = 0; + INT16 nOperation = AGSMDATABASE_OPERATION_SELECT; + PVOID pvPacketPingSend = pThis->m_csPacketRequestCash.MakePacket(TRUE, &nPacketLength, 0, &pcsCharacter->m_szID, &pcsCharacter->m_lID); + if (!pvPacketPingSend) + return FALSE; + + + CHAR *pszAccountID = NULL; + pThis->m_csPacketRequestCash.GetField(TRUE, pvPacketPingSend, nPacketLength, &pszAccountID); + printf("Got back '%s'\n", pszAccountID); + + BOOL bResult = pThis->MakeAndSendRelayPacket(pvPacketPingSend, AGSMRELAY_PARAM_REQUEST_CASH); + pThis->m_csPacketRequestCash.FreePacket(pvPacketPingSend); + + return bResult; +} // //=================================== @@ -1273,6 +1314,7 @@ BOOL AgsmRelay2::SetCallbackOperation() || !SetCallbackSiegeApplication(CBOperationSiegeApplication, this) || !SetCallbackSiegeObject(CBOperationSiegeObject, this) || !SetCallbackTax(CBOperation, this) + || !SetCallbackRefreshCash(CBOperationRefreshCash, this) //############################# //|| !SetCallbackArchlord(CBOperationArchlord, this) //|| !SetCallbackLordGuard(CBOperationLordGuard, this) diff --git a/Modules/AServer/AgsmRelay2/AgsmRelay2.h b/Modules/AServer/AgsmRelay2/AgsmRelay2.h index 2052dbc9..dd632cf9 100644 --- a/Modules/AServer/AgsmRelay2/AgsmRelay2.h +++ b/Modules/AServer/AgsmRelay2/AgsmRelay2.h @@ -13,6 +13,7 @@ #include "AgsmServerManager2.h" #include "AgpmFactors.h" #include "AgpmCharacter.h" +#include "AgpdCharacter.h" #include "AgsmCharacter.h" #include "AgpmItem.h" #include "AgsmItem.h" @@ -33,6 +34,7 @@ #include "AgsmAdmin.h" #include "AgsmAuctionRelay.h" #include "AgsmCashMall.h" +#include "AgpmCashMall.h" #include "AuCircularBuffer.h" #include "AgsmReturnToLogin.h" #include "AgsmWantedCriminal.h" @@ -140,6 +142,38 @@ class Relay2Sender : public zzThread class AgsmEventSystem; class AgsmItemManager; + +typedef enum AgpmCashMallPacketOperation { + AGPMCASH_PACKET_OPERATION_REFRESH_CASH = 0, +} AgpmCashMallPacketOperation; + +struct PACKET_AGSP_REFRESH_CASH_RELAY : public PACKET_HEADER +{ + CHAR FlagLow; + INT16 nParam; + INT16 nOperation; + CHAR strCharName[AGPACHARACTER_MAX_ID_STRING+1]; + INT32 nCoins; + + PACKET_AGSP_REFRESH_CASH_RELAY() + :nOperation(0), FlagLow(1) + { + cType = AGSMRELAY_PACKET_TYPE; + nParam = AGSMRELAY_PARAM_REQUEST_CASH; + unPacketLength = (UINT16)sizeof(PACKET_AGSP_REFRESH_CASH_RELAY); + } +}; +struct PACKET_AGSP_REFRESH_CASH_RESULT_RELAY : public PACKET_AGSP_REFRESH_CASH_RELAY +{ + PACKET_AGSP_REFRESH_CASH_RESULT_RELAY(CHAR *CharName, INT32 Coins) + { + nOperation = AGPMCASH_PACKET_OPERATION_REFRESH_CASH; + unPacketLength = (UINT16)sizeof(PACKET_AGSP_REFRESH_CASH_RELAY); + strncpy(strCharName, CharName, AGPACHARACTER_MAX_ID_STRING); + nCoins = Coins; + } +}; + /************************************************/ /* The Definition of AgsmRelay2 class */ /************************************************/ @@ -154,6 +188,7 @@ class AgsmRelay2 : public AgsModule AgsmServerManager2 *m_pAgsmServerManager2; AgpmCharacter *m_pAgpmCharacter; AgsmCharacter *m_pAgsmCharacter; + AgpmBillInfo *m_pAgpmBillInfo; AgpmItem *m_pAgpmItem; AgsmItem *m_pAgsmItem; AgsmItemConvert *m_pAgsmItemConvert; @@ -176,6 +211,7 @@ class AgsmRelay2 : public AgsModule AgpmMailBox *m_pAgpmMailBox; AgsmMailBox *m_pAgsmMailBox; AgsmCashMall *m_pAgsmCashMall; + AgpmCashMall *m_pAgpmCashMall; AgsmReturnToLogin *m_pAgsmReturnToLogin; AgsmWantedCriminal *m_pAgsmWantedCriminal; AgsmSiegeWar *m_pAgsmSiegeWar; @@ -279,6 +315,7 @@ class AgsmRelay2 : public AgsModule BOOL OnParamMail(INT16 nParam, PVOID pvPacket, UINT32 ulNID); BOOL OnParamMailItem(INT16 nParam, PVOID pvPacket, UINT32 ulNID); BOOL OnParamCashItemBuyList(INT16 nParam, PVOID pvPacket, UINT32 ulNID); + BOOL OnParamRequestCash(INT16 nParam, PVOID pvPacket, UINT32 ulNID, PACKET_HEADER* pvOuterPacket); BOOL OnParamWantedCriminal(INT16 nParam, PVOID pvPacket, UINT32 ulNID); BOOL OnParamNotifySaveAll(INT16 nParam, PVOID pvPacket, UINT32 ulNID); BOOL OnParamCastle(INT16 nParam, PVOID pvPacket, UINT32 ulNID); @@ -326,6 +363,7 @@ class AgsmRelay2 : public AgsModule static BOOL CBOperationSiegeObject(PVOID pData, PVOID pClass, PVOID pCustData); static BOOL CBOperationArchlord(PVOID pData, PVOID pClass, PVOID pCustData); static BOOL CBOperationLordGuard(PVOID pData, PVOID pClass, PVOID pCustData); + static BOOL CBOperationRefreshCash(PVOID pData, PVOID pClass, PVOID pCustData); // Finish operation callback (relay-side after execution callback) static BOOL CBFinishOperation(PVOID pData, PVOID pClass, PVOID pCustData); @@ -346,6 +384,7 @@ class AgsmRelay2 : public AgsModule static BOOL CBFinishOperationSiegeObject(PVOID pData, PVOID pClass, PVOID pCustData); static BOOL CBFinishOperationArchlord(PVOID pData, PVOID pClass, PVOID pCustData); static BOOL CBFinishOperationLordGuard(PVOID pData, PVOID pClass, PVOID pCustData); + static BOOL CBFinishOperationRefreshCash(PVOID pData, PVOID pClass, PVOID pCustData); // Select result (relay-side select query result processing) BOOL OnSelectResult(AuRowset *pRowset, AgsdDBParam *pAgsdRelay); @@ -366,6 +405,7 @@ class AgsmRelay2 : public AgsModule BOOL OnSelectResultSiegeObject(AuRowset *pRowset, AgsdDBParam *pAgsdRelay2); BOOL OnSelectResultArchlord(AuRowset *pRowset, AgsdDBParam *pAgsdRelay2); BOOL OnSelectResultLordGuard(AuRowset *pRowset, AgsdDBParam *pAgsdRelay2); + BOOL OnSelectResultRefreshCash(AuRowset *pRowset, AgsdDBParam *pAgsdRelay2); // Callback Setting (relay side operation callback setting) BOOL SetCallbackCustom(ApModuleDefaultCallBack pfCallback, PVOID pClass); @@ -407,6 +447,7 @@ class AgsmRelay2 : public AgsModule BOOL SetCallbackTax(ApModuleDefaultCallBack pfCallback, PVOID pClass); BOOL SetCallbackArchlord(ApModuleDefaultCallBack pfCallback, PVOID pClass); BOOL SetCallbackLordGuard(ApModuleDefaultCallBack pfCallback, PVOID pClass); + BOOL SetCallbackRefreshCash(ApModuleDefaultCallBack pfCallback, PVOID pClass); // Callback (Game server side callbacks) static BOOL CBCustom(PVOID pData, PVOID pClass, PVOID pCustData); @@ -505,6 +546,7 @@ class AgsmRelay2 : public AgsModule static BOOL CBAdminItemConvertUpdate2(PVOID pData, PVOID pClass, PVOID pCustData); static BOOL CBAdminItemUpdate(PVOID pData, PVOID pClass, PVOID pCustData); static BOOL CBAdminSkillUpdate(PVOID pData, PVOID pClass, PVOID pCustData); + static BOOL CBRefreshCash(PVOID pData, PVOID pClass, PVOID pCustData); // Operation result callback (game-side after execution callback) static BOOL CBOperationResultGuildMaster(PVOID pData, PVOID pClass, PVOID pCustData); diff --git a/Modules/AServer/AgsmRelay2/AgsmRelay2CashItemBuyList.cpp b/Modules/AServer/AgsmRelay2/AgsmRelay2CashItemBuyList.cpp index 2437778b..75c471c7 100644 --- a/Modules/AServer/AgsmRelay2/AgsmRelay2CashItemBuyList.cpp +++ b/Modules/AServer/AgsmRelay2/AgsmRelay2CashItemBuyList.cpp @@ -34,6 +34,105 @@ void AgsmRelay2::InitPacketCashItemBuyList() } +BOOL AgsmRelay2::OnParamRequestCash(INT16 nParam, PVOID pvPacket, UINT32 ulNID, PACKET_HEADER* pvOuterPacket) +{ + + PACKET_AGSP_REFRESH_CASH_RELAY *pPacketRaw = (PACKET_AGSP_REFRESH_CASH_RELAY*) pvOuterPacket; + + if (NULL != pPacketRaw && pPacketRaw->nOperation == AGPMCASH_PACKET_OPERATION_REFRESH_CASH) { + printf("Send coins (%d) back to user '%s' (%d)\n", pPacketRaw->nCoins, pPacketRaw->strCharName); + AgpdCharacter *pcsCharacter = m_pAgpmCharacter->GetCharacter(pPacketRaw->strCharName); + m_pAgpmBillInfo->SetCashGlobal(pcsCharacter, pPacketRaw->nCoins, pPacketRaw->nCoins); + PACKET_BILLINGINFO_CASHINFO pPacket(pcsCharacter->m_lID, pPacketRaw->nCoins, pPacketRaw->nCoins); + SendPacketUser(pPacket, m_pAgsmCharacter->GetCharDPNID(pcsCharacter)); + return TRUE; + } + + AgsdRelay2RequestCash *pAgsdRelay2 = new AgsdRelay2RequestCash; + + CHAR *pszAccountID = NULL; + + m_csPacketRequestCash.GetField(TRUE, pvPacket, 256, &pszAccountID); + + pAgsdRelay2->m_ulNID = ulNID; + _tcscpy(pAgsdRelay2->m_szAccountID, NULL != pszAccountID ? pszAccountID : _T("")); + + return EnumCallback(AGSMRELAY_PARAM_REQUEST_CASH, (PVOID)pAgsdRelay2, (PVOID)nParam); + } + +BOOL AgsmRelay2::CBOperationRefreshCash(PVOID pData, PVOID pClass, PVOID pCustData) + { + AgsmRelay2 *pThis = (AgsmRelay2 *) pClass; + AgsdRelay2RequestCash *pAgsdRelay2 = (AgsdRelay2RequestCash *) pData; + + AgsdQueryWithParam* pQuery = new AgsdQueryWithParam; + pAgsdRelay2->m_eOperation = AGSMDATABASE_OPERATION_SELECT; + pQuery->m_nIndex = 1027; + pQuery->m_pParam = pAgsdRelay2; + pQuery->SetCallback(AgsmRelay2::CBFinishOperationRefreshCash, + AgsmRelay2::CBFailOperation, + pThis, pAgsdRelay2); + + return pThis->m_pAgsmDatabasePool->Execute(pQuery); + } + + +BOOL AgsmRelay2::CBFinishOperationRefreshCash(PVOID pData, PVOID pClass, PVOID pCustData) + { + if (!pClass || !pCustData) + return FALSE; + + AgsmRelay2 *pThis = (AgsmRelay2 *) pClass; + AgsdDBParam *pAgsdRelay2 = NULL; + pAgsdRelay2 = (AgsdDBParam *) pCustData; + AuRowset *pRowset = (AuRowset *) pData; + + if (NULL != pRowset && AGSMDATABASE_OPERATION_SELECT == pAgsdRelay2->m_eOperation) + pThis->OnSelectResultRefreshCash(pRowset, pAgsdRelay2); + + pAgsdRelay2->Release(); + + return TRUE; + } + +BOOL AgsmRelay2::OnSelectResultRefreshCash(AuRowset *pRowset, AgsdDBParam *pAgsdRelay2) + { + AgsdRelay2RequestCash *pAgsdRelay2Mail = static_cast(pAgsdRelay2); + + AgsdServer *pGameServer = m_pAgsmServerManager->GetGameServerBySocketIndex(pAgsdRelay2Mail->m_ulNID); + if (!pGameServer) + return FALSE; + + INT32 lTotalSize = pRowset->GetRowBufferSize() * pRowset->GetRowCount(); + INT32 lTotalStep = 1 + (INT32) (lTotalSize / 20000); + INT32 lRowsPerStep = 20000 / pRowset->GetRowBufferSize(); + for (INT32 lStep2 = 0; lStep2 < lTotalStep; lStep2++) + { + + UINT32 ulCol = 0; + + CHAR *psz = NULL; + + CHAR *charName = NULL; + INT32 coins = 0; + + if (NULL != (psz = (CHAR *) pRowset->Get(lStep2, ulCol++))) { + charName = psz; + } + + if (NULL != (psz = (CHAR *) pRowset->Get(lStep2, ulCol++))) { + coins = _ttoi(psz); + } + + PACKET_AGSP_REFRESH_CASH_RESULT_RELAY pPacket(charName, coins, pAgsdRelay2Mail->m_lCID); + + AgsEngine::GetInstance()->SendPacket(pPacket, pAgsdRelay2Mail->m_ulNID); + break; + } + + return TRUE; + } + BOOL AgsmRelay2::OnParamCashItemBuyList(INT16 nParam, PVOID pvPacket, UINT32 ulNID) { @@ -335,3 +434,52 @@ void AgsdRelay2CashItemBuyList::Dump(CHAR *pszOp) } +/********************************************************************/ +/* The Implementation of AgsdRelay2RequestCash class */ +/********************************************************************/ +// +AgsdRelay2RequestCash::AgsdRelay2RequestCash() + { + ZeroMemory(m_szAccountID, sizeof(m_szAccountID)); + } + + +BOOL AgsdRelay2RequestCash::SetParamSelect(AuStatement* pStatement) + { + INT16 i=0; + + pStatement->SetParam(i++, m_szAccountID, sizeof(m_szAccountID)); + + return TRUE; + } + +BOOL AgsdRelay2RequestCash::SetParamUpdate(AuStatement* pStatement) + { + INT16 i=0; + + return TRUE; + } + + +BOOL AgsdRelay2RequestCash::SetParamInsert(AuStatement *pStatement) + { + INT16 i=0; + + pStatement->SetParam(i++, m_szAccountID, sizeof(m_szAccountID)); + + return TRUE; + } + +BOOL AgsdRelay2RequestCash::SetParamExecute(AuStatement *pStatement) + { + INT16 i=0; + + pStatement->SetParam(i++, m_szAccountID, sizeof(m_szAccountID)); + + return TRUE; + } + + +void AgsdRelay2RequestCash::Dump(CHAR *pszOp) + { + }