bool G::CostCoin(int coinCost){ if (coinCost>getCoin()) { return false; } setCoin(getCoin()-coinCost); return true; }
/*Dynamic approach: * s[n] = coin[x], if coin[x] == i * min(s[j]) + 1, where exists a coin[x] = s[i] - s[j] */ void computeDynamic(unsigned n) { IntVector s; //s[n] = how many coins do we need to compute n s.push_back(0); //0 coins for 0 dyn_solution.push_back(IntVector()); for (unsigned i = 1; i <= n; ++i) { unsigned coin = getCoin(i); if (coin) //found a coin equal to i { s.push_back(1); dyn_solution.push_back(IntVector(1, coin)); } else { coin = getPreviousMin(s, i); if (!coin) { std::cerr<<"i: "<<i<<"\n"; throw std::logic_error("Cannot find a coin for current i"); } s.push_back(coin + 1); } } printVector(dyn_solution.back()); //printVector(s); }
void CNiuNiuRoom::setBankerIdx(uint8_t nIdx ) { m_nBankerIdx = nIdx ; auto pp = getPlayerByIdx(m_nBankerIdx) ; uint16_t nCnt = getPlayerCntWithState(eRoomPeer_CanAct) - 1 ; setBankCoinLimitForBet( pp->getCoin() / nCnt ) ; }
void G::setCoin(int coin) { if (coin == getCoin()) { return; } setIntForKey("coin", coin+COIN_OFFSET); UserDefault::getInstance()->flush(); Director::getInstance()->getEventDispatcher()->dispatchCustomEvent(EVENT_COIN_UPDATE); }
void ISitableRoom::onPlayerEnterRoom(stEnterRoomData* pEnterRoomPlayer,int8_t& nSubIdx ) { IRoom::onPlayerEnterRoom(pEnterRoomPlayer, nSubIdx); auto pp = getSitdownPlayerByUID(pEnterRoomPlayer->nUserUID); if (pp) { auto pStandPlayer = getPlayerByUserUID(pEnterRoomPlayer->nUserUID); if (pStandPlayer->nCoin >= pp->getCoin()) { if (pStandPlayer->nCoin != pp->getCoin()) { LOGFMTD("uid = %u reenter room coin is not the same . stand = %u , sit = %u", pp->getUserUID(), pStandPlayer->nCoin, pp->getCoin()); } pStandPlayer->nCoin -= pp->getCoin(); } else { LOGFMTE("uid = %u stand coin is few then sit , why ? but stand = %u , sit = %u", pp->getUserUID(), pStandPlayer->nCoin, pp->getCoin()); pStandPlayer->nCoin = 0; } pp->reactive(pEnterRoomPlayer->nUserSessionID); } }
bool CPlayerBaseData::OnMessage( stMsg* pMsg , eMsgPort eSenderPort ) { if ( IPlayerComponent::OnMessage(pMsg,eSenderPort) ) { return true ; } switch( pMsg->usMsgType ) { case MSG_PLAYER_USE_ENCRYPT_NUMBER: { stMsgPlayerUseEncryptNumberRet msgBack ; stMsgPlayerUseEncryptNumber* pRet = (stMsgPlayerUseEncryptNumber*)pMsg ; if ( 1 || CEncryptNumber::isNumberValid(pRet->nNumber) ) { stMsgVerifyEncryptNumber msgVerifyEncrypt ; msgVerifyEncrypt.nNumber = pRet->nNumber ; msgVerifyEncrypt.nUserUID = GetPlayer()->GetUserUID() ; SendMsg(&msgVerifyEncrypt,sizeof(msgVerifyEncrypt)) ; break; } msgBack.nRet = 1 ; msgBack.nAddCoin = 0 ; msgBack.nFinalcoin = getCoin(); SendMsg(&msgBack,sizeof(msgBack)) ; LOGFMTD("invalid number uid = %u",GetPlayer()->GetUserUID()); } break ; case MSG_VERIFY_ENCRYPT_NUMBER: { stMsgPlayerUseEncryptNumberRet msgBack ; stMsgVerifyEncryptNumberRet* pRet = (stMsgVerifyEncryptNumberRet*)pMsg ; if ( pRet->nRet ) { stMsgPlayerUseEncryptNumberRet msgBack ; msgBack.nRet = pRet->nRet ; msgBack.nFinalcoin = getCoin(); SendMsg(&msgBack,sizeof(msgBack)) ; break; } msgBack.nRet = 0 ; msgBack.nAddCoin = pRet->nAddCoin ; msgBack.nCoinType = pRet->nCoinType ; AddMoney(pRet->nAddCoin,pRet->nCoinType == 0 ) ; msgBack.nFinalcoin = GetAllCoin(); msgBack.nDiamond = GetAllDiamoned() ; SendMsg(&msgBack,sizeof(msgBack)) ; LOGFMTD("uid = %u add coin via encrypt number" , GetPlayer()->GetUserUID()); } break; case MSG_REQ_TOTAL_GAME_OFFSET: { stMsgReqRobotTotalGameOffsetRet msgBack ; msgBack.nTotalGameOffset = m_stBaseData.nTotalGameCoinOffset ; SendMsg(&msgBack,sizeof(msgBack)) ; LOGFMTD("robot uid = %u req total offset = %d",GetPlayer()->GetUserUID(),msgBack.nTotalGameOffset) ; } break; case MSG_TELL_PLAYER_TYPE: { stMsgTellPlayerType* pRet = (stMsgTellPlayerType*)pMsg ; m_ePlayerType = (ePlayerType)pRet->nPlayerType ; LOGFMTD("uid = %u , tell player type = %u",GetPlayer()->GetUserUID(),m_ePlayerType); } break; case MSG_GET_VIP_CARD_GIFT: { stMsgGetVipcardGift* pRet = (stMsgGetVipcardGift*)pMsg ; stMsgGetVipcardGiftRet msgBack ; msgBack.nVipCardType = pRet->nVipCardType ; msgBack.nAddCoin = 0 ; if ( m_stBaseData.nCardType != pRet->nVipCardType ) { msgBack.nRet = 1 ; SendMsg(&msgBack,sizeof(msgBack)) ; LOGFMTD("player uid = %d get vip card coin ret = %d",GetPlayer()->GetUserUID(),msgBack.nRet) ; break; } time_t tNow = time(nullptr) ; if ( m_stBaseData.nCardEndTime < tNow ) { msgBack.nRet = 2 ; SendMsg(&msgBack,sizeof(msgBack)) ; LOGFMTD("player uid = %d get vip card coin ret = %d",GetPlayer()->GetUserUID(),msgBack.nRet) ; break; } struct tm pTempNow,pLastTake ; pTempNow = *localtime(&tNow) ; time_t nLastTake = m_stBaseData.tLastTakeCardGiftTime ; pLastTake = *localtime(&nLastTake) ; if ( pTempNow.tm_year == pLastTake.tm_year && pTempNow.tm_mon == pLastTake.tm_mon && pTempNow.tm_yday == pLastTake.tm_yday ) { msgBack.nRet = 3 ; SendMsg(&msgBack,sizeof(msgBack)) ; LOGFMTD("player uid = %d get vip card coin ret = %d",GetPlayer()->GetUserUID(),msgBack.nRet) ; break; } msgBack.nRet = 0 ; msgBack.nAddCoin = COIN_FOR_VIP_CARD ; AddMoney(COIN_FOR_VIP_CARD); m_stBaseData.tLastTakeCardGiftTime = tNow ; SendMsg(&msgBack,sizeof(msgBack)) ; m_bCommonLogicDataDirty = true ; LOGFMTD("player uid = %d get vip card coin ret = %d",GetPlayer()->GetUserUID(),msgBack.nRet) ; } break; case MSG_PLAYER_CHECK_INVITER: { stMsgCheckInviterRet msgBack ; stMsgCheckInviter* pRet = (stMsgCheckInviter*)pMsg ; msgBack.nInviterUID = pRet->nInviterUID ; if ( m_stBaseData.nUserUID == pRet->nInviterUID ) { msgBack.nRet = 1 ; LOGFMTE("can not invite self , uid = %d",GetPlayer()->GetUserUID()) ; SendMsg(&msgBack,sizeof(msgBack)) ; break; } if ( m_stBaseData.nInviteUID ) { msgBack.nRet = 2 ; LOGFMTD("you already have invite = %d , uid = %d",m_stBaseData.nInviteUID,GetPlayer()->GetUserUID()) ; SendMsg(&msgBack,sizeof(msgBack)) ; break; } auto tPlayer = CGameServerApp::SharedGameServerApp()->GetPlayerMgr()->GetPlayerByUserUID(pRet->nInviterUID); if ( tPlayer ) { LOGFMTD("do invite = %d ,player = %d",pRet->nInviterUID,GetPlayer()->GetUserUID()) ; onBeInviteBy(pRet->nInviterUID) ; msgBack.nRet = 0 ; SendMsg(&msgBack,sizeof(msgBack)) ; } else { stMsgDBCheckInvite msgCheck ; msgCheck.nInviteUserUID = pRet->nInviterUID ; SendMsg(&msgCheck,sizeof(msgCheck)) ; LOGFMTD("invite = %d not online, so ask db i am uid = %d",pRet->nInviterUID,GetPlayer()->GetUserUID()) ; } } break; case MSG_DB_CHECK_INVITER: { stMsgCheckInviterRet msgBack ; stMsgDBCheckInviteRet* pRet = (stMsgDBCheckInviteRet*)pMsg ; msgBack.nInviterUID = pRet->nInviteUseUID ; if ( pRet->nRet ) { msgBack.nRet = 1 ; SendMsg(&msgBack,sizeof(msgBack)) ; } else { onBeInviteBy(pRet->nInviteUseUID) ; msgBack.nRet = 0 ; SendMsg(&msgBack,sizeof(msgBack)) ; } } break; case MSG_REQUEST_CLIENT_IP: { stMsgRequestClientIpRet* pRet = (stMsgRequestClientIpRet*)pMsg ; if ( pRet->nRet == 0 ) { m_strCurIP = pRet->vIP ; LOGFMTD("get client ip = %s session id = %d",m_strCurIP.c_str(),GetPlayer()->GetSessionID()) ; } else { LOGFMTE("cant not request client ip , uid = %d",GetPlayer()->GetUserUID()) ; } } break; case MSG_SHOP_BUY_ITEM_ORDER: { stMsgPlayerShopBuyItemOrder* pRet = (stMsgPlayerShopBuyItemOrder*)pMsg ; stMsgPlayerShopBuyItemOrderRet msgBack ; msgBack.nChannel = pRet->nChannel ; msgBack.nShopItemID = pRet->nShopItemID ; msgBack.nRet = 0 ; memset(msgBack.cOutTradeNo,0,sizeof(msgBack.cOutTradeNo)) ; memset(msgBack.cPrepayId,0,sizeof(msgBack.cPrepayId)) ; CShopConfigMgr* pMgr = (CShopConfigMgr*)CGameServerApp::SharedGameServerApp()->GetConfigMgr()->GetConfig(CConfigManager::eConfig_Shop); stShopItem* pItem = pMgr->GetShopItem(pRet->nShopItemID); if ( pItem == nullptr ) { msgBack.nRet = 1 ; SendMsg(&msgBack,sizeof(msgBack)) ; LOGFMTE("can not find shop item , for order uid = %d",GetPlayer()->GetUserUID()) ; break; } if ( msgBack.nChannel != ePay_WeChat ) { msgBack.nRet = 4 ; SendMsg(&msgBack,sizeof(msgBack)) ; LOGFMTE("current must be wechat channel for order channel = %d, uid = %d",msgBack.nChannel,GetPlayer()->GetUserUID() ); break; } if ( m_strCurIP.empty() ) { msgBack.nRet = 2 ; SendMsg(&msgBack,sizeof(msgBack)) ; LOGFMTE("cur rent ip = null , for order uid = %d",GetPlayer()->GetUserUID()) ; break; } stMsgVerifyItemOrder msgOrder ; memset(msgOrder.cShopDesc,0,sizeof(msgOrder.cShopDesc)); sprintf_s(msgOrder.cShopDesc,sizeof(msgOrder.cShopDesc),"%s",pItem->strItemName.c_str()) ; memset(msgOrder.cOutTradeNo,0,sizeof(msgOrder.cOutTradeNo)); sprintf_s(msgOrder.cOutTradeNo,sizeof(msgOrder.cOutTradeNo),"%dE%dE%u",pItem->nShopItemID,GetPlayer()->GetUserUID(),(uint32_t)time(nullptr)) ; msgOrder.nPrize = pItem->nPrize * 100 ; msgOrder.nChannel = pRet->nChannel ; memset(msgOrder.cTerminalIp,0,sizeof(msgOrder.cTerminalIp)); sprintf_s(msgOrder.cTerminalIp,sizeof(msgOrder.cTerminalIp),"%s",m_strCurIP.c_str()) ; SendMsg(&msgOrder,sizeof(msgOrder)) ; LOGFMTI("order shop item to verify shop item = %d , uid = %d",pItem->nShopItemID,GetPlayer()->GetUserUID()) ; } break; case MSG_VERIFY_ITEM_ORDER: { stMsgVerifyItemOrderRet* pRet = (stMsgVerifyItemOrderRet*)pMsg ; stMsgPlayerShopBuyItemOrderRet msgBack ; memset(msgBack.cOutTradeNo,0,sizeof(msgBack.cOutTradeNo)) ; memset(msgBack.cPrepayId,0,sizeof(msgBack.cPrepayId)) ; msgBack.nChannel = pRet->nChannel ; std::string strTradeNo(pRet->cOutTradeNo,sizeof(pRet->cOutTradeNo)); std::string shopItem = strTradeNo.substr(0,strTradeNo.find_first_of('E')) ; if ( shopItem.empty() ) { msgBack.nShopItemID = 0 ; LOGFMTE("outTradeNo shop item is null , uid = %d",GetPlayer()->GetUserUID()) ; } else { msgBack.nShopItemID = atoi(shopItem.c_str()) ; } if ( pRet->nRet ) { msgBack.nRet = 3 ; } else { msgBack.nRet = 0; memcpy(msgBack.cOutTradeNo,pRet->cOutTradeNo,sizeof(pRet->cOutTradeNo)); memcpy(msgBack.cPrepayId,pRet->cPrepayId,sizeof(pRet->cPrepayId)); } LOGFMTI("shopitem id = %d shop order ret = %d, uid = %d",msgBack.nShopItemID,pRet->nRet,GetPlayer()->GetUserUID()) ; SendMsg(&msgBack,sizeof(msgBack)) ; } break; case MSG_BUY_SHOP_ITEM: { stMsgPlayerBuyShopItem* pRet = (stMsgPlayerBuyShopItem*)pMsg ; CShopConfigMgr* pMgr = (CShopConfigMgr*)CGameServerApp::SharedGameServerApp()->GetConfigMgr()->GetConfig(CConfigManager::eConfig_Shop); stShopItem* pItem = pMgr->GetShopItem(pRet->nShopItemID); stMsgPlayerBuyShopItemRet msgBack ; msgBack.nBuyShopItemForUserUID = pRet->nBuyShopItemForUserUID ; msgBack.nDiamoned = 0 ; msgBack.nSavedMoneyForVip = 0 ; msgBack.nShopItemID = pRet->nShopItemID ; msgBack.nRet = 0 ; if( pItem == nullptr ) { LOGFMTE("uid = %u buy shop id = %u not exsit",GetPlayer()->GetUserUID(),pRet->nShopItemID) ; msgBack.nRet = 5 ; msgBack.nDiamoned = GetAllDiamoned(); msgBack.nFinalyCoin = GetAllCoin() ; SendMsg(&msgBack,sizeof(msgBack)) ; break; } if ( 0 == pItem->nPrizeType ) { stMsgToVerifyServer msgVerify ; msgVerify.nBuyerPlayerUserUID = GetPlayer()->GetUserUID(); msgVerify.nBuyForPlayerUserUID = msgVerify.nBuyerPlayerUserUID ; msgVerify.nMiUserUID = pRet->nMiUserUID ; msgVerify.nShopItemID = pRet->nShopItemID ; msgVerify.nTranscationIDLen = pRet->nBufLen ; msgVerify.nChannel = pRet->nChannelID ; CAutoBuffer buffer(sizeof(stMsgPlayerBuyShopItem) + pRet->nBufLen ) ; buffer.addContent(&msgVerify,sizeof(msgVerify)); buffer.addContent(((char*)pRet) + sizeof(stMsgPlayerBuyShopItem),pRet->nBufLen); SendMsg((stMsg*)buffer.getBufferPtr(),buffer.getContentSize()); break; } // 0 RMB ,1 diamoned ,2 coin ; // do diamond purchase if ( pItem->nPrize > GetAllDiamoned() ) { msgBack.nRet = 1 ; msgBack.nDiamoned = GetAllDiamoned(); msgBack.nFinalyCoin = GetAllCoin() ; SendMsg(&msgBack,sizeof(msgBack)) ; LOGFMTD("uid = %u buy item diamond is not enough shop id = %u" , GetPlayer()->GetUserUID(),pItem->nShopItemID) ; break; } if ( pRet->nShopItemID == 16 ) { LOGFMTI("uid = %d buy a vip card month card ",GetPlayer()->GetUserUID()) ; updateCardLife(); if ( eCard_LV1 == m_stBaseData.nCardType ) { m_stBaseData.nCardEndTime = m_stBaseData.nCardEndTime + 60 * 60 * 24 * 31; } else if ( eCard_LV1 < m_stBaseData.nCardType ) { msgBack.nRet = 6 ; msgBack.nDiamoned = GetAllDiamoned(); msgBack.nFinalyCoin = GetAllCoin() ; SendMsg(&msgBack,sizeof(msgBack)) ; LOGFMTD("uid = %u buy item eCard_LV1 < m_stBaseData.nCardType shop id = %u" , GetPlayer()->GetUserUID(),pItem->nShopItemID) ; break; } else { m_stBaseData.nCardEndTime = time(nullptr) + 60 * 60 * 24 * 31; } m_stBaseData.nCardType = eCard_LV1 ; m_bCommonLogicDataDirty = true ; } else if ( 17 == pRet->nShopItemID ) { LOGFMTI("uid = %d buy a vip card month card ",GetPlayer()->GetUserUID()) ; updateCardLife(); if ( eCard_LV2 == m_stBaseData.nCardType ) { m_stBaseData.nCardEndTime = m_stBaseData.nCardEndTime + 60 * 60 * 24 * 31; } else if ( eCard_LV2 < m_stBaseData.nCardType ) { msgBack.nRet = 6 ; msgBack.nDiamoned = GetAllDiamoned(); msgBack.nFinalyCoin = GetAllCoin() ; SendMsg(&msgBack,sizeof(msgBack)) ; LOGFMTD("uid = %u buy item eCard_LV2 < m_stBaseData.nCardType shop id = %u" , GetPlayer()->GetUserUID(),pItem->nShopItemID) ; break; } else { m_stBaseData.nCardEndTime = time(nullptr) + 60 * 60 * 24 * 31; } m_stBaseData.nCardType = eCard_LV2 ; m_bCommonLogicDataDirty = true ; } else { LOGFMTD("player uid = %u buy coin use diamond",GetPlayer()->GetUserUID()); AddMoney(pItem->nCount); } decressMoney(pItem->nPrize,true) ; msgBack.nDiamoned = GetAllDiamoned(); msgBack.nFinalyCoin = GetAllCoin() ; SendMsg(&msgBack,sizeof(msgBack)) ; LOGFMTD("uid = %u buy item ok shop id = %u" , GetPlayer()->GetUserUID(),pItem->nShopItemID) ; break; } break; case MSG_VERIFY_TANSACTION: { stMsgFromVerifyServer* pRet = (stMsgFromVerifyServer*)pMsg ; stMsgPlayerBuyShopItemRet msgBack ; msgBack.nBuyShopItemForUserUID = pRet->nBuyForPlayerUserUID ; msgBack.nDiamoned = 0 ; msgBack.nSavedMoneyForVip = 0 ; msgBack.nShopItemID = pRet->nShopItemID ; msgBack.nRet = 0 ; if ( pRet->nRet == 4 ) // success { { CShopConfigMgr* pMgr = (CShopConfigMgr*)CGameServerApp::SharedGameServerApp()->GetConfigMgr()->GetConfig(CConfigManager::eConfig_Shop); stShopItem* pItem = pMgr->GetShopItem(pRet->nShopItemID); if ( pItem == nullptr ) { msgBack.nRet = 5 ; LOGFMTE("can not find shop id = %d , buyer uid = %d",pRet->nShopItemID,pRet->nBuyerPlayerUserUID) ; } else { AddMoney(pItem->nCount,true) ; LOGFMTI("add coin with shop id = %d for buyer uid = %d ",pRet->nShopItemID,pRet->nBuyerPlayerUserUID) ; } } // save log stMsgSaveLog msgLog ; memset(msgLog.vArg,0,sizeof(msgLog.vArg)); msgLog.nJsonExtnerLen = 0 ; msgLog.nLogType = eLog_Purchase ; msgLog.nTargetID = GetPlayer()->GetUserUID() ; memset(msgLog.vArg,0,sizeof(msgLog.vArg)) ; msgLog.vArg[0] = GetAllCoin() ; msgLog.vArg[1] = pRet->nShopItemID ; SendMsg(&msgLog,sizeof(msgLog)) ; } else { msgBack.nRet = 2 ; LOGFMTE("uid = %d ,shop id = %d , verify error ",pRet->nBuyerPlayerUserUID,pRet->nShopItemID) ; } msgBack.nDiamoned = GetAllDiamoned(); msgBack.nFinalyCoin = GetAllCoin() ; SendMsg(&msgBack,sizeof(msgBack)) ; } break; case MSG_ON_PLAYER_BIND_ACCOUNT: { m_stBaseData.isRegister = true ; m_bPlayerInfoDataDirty = true ; LOGFMTD("player bind account ok uid = %u",GetPlayer()->GetUserUID()); } break; case MSG_READ_PLAYER_BASE_DATA: // from db server ; { stMsgDataServerGetBaseDataRet* pBaseData = (stMsgDataServerGetBaseDataRet*)pMsg ; if ( pBaseData->nRet ) { LOGFMTE("do not exsit playerData") ; return true; } memcpy(&m_stBaseData,&pBaseData->stBaseData,sizeof(m_stBaseData)); LOGFMTD("recived base data uid = %d",pBaseData->stBaseData.nUserUID); nReadingDataFromDB = 2 ; SendBaseDatToClient(); CGameServerApp::SharedGameServerApp()->GetPlayerMgr()->getPlayerDataCaher().removePlayerDataCache(pBaseData->stBaseData.nUserUID) ; return true ; } break; // case MSG_PLAYER_REQUEST_NOTICE: // { //// CGameServerApp::SharedGameServerApp()->GetBrocaster()->SendInformsToPlayer(GetPlayer()) ; //// CInformConfig* pConfig = (CInformConfig*)CGameServerApp::SharedGameServerApp()->GetConfigMgr()->GetConfig(CConfigManager::eConfig_Informs) ; //// m_stBaseData.nNoticeID = pConfig->GetMaxInformID(); // } // break; case MSG_PLAYER_MODIFY_SIGURE: { stMsgPLayerModifySigure* pMsgRet = (stMsgPLayerModifySigure*)pMsg ; memcpy(m_stBaseData.cSignature,pMsgRet->pNewSign,sizeof(m_stBaseData.cSignature)); stMsgPlayerModifySigureRet ret ; ret.nRet = 0 ; SendMsg(&ret,sizeof(ret)) ; m_bPlayerInfoDataDirty = true ; } break; case MSG_PLAYER_MODIFY_NAME: { stMsgPLayerModifyName* pMsgRet = (stMsgPLayerModifyName*)pMsg ; stMsgPlayerModifyNameRet ret ; ret.nRet = 0 ; memcpy(ret.pName,pMsgRet->pNewName,sizeof(ret.pName)); if ( pMsgRet->pNewName[sizeof(pMsgRet->pNewName) -1 ] != 0 ) { ret.nRet = 1 ; LOGFMTE("name is too long uid = %d",GetPlayer()->GetUserUID()); } else if ( strcmp(pMsgRet->pNewName,m_stBaseData.cName) == 0 ) { } else { memcpy(m_stBaseData.cName,pMsgRet->pNewName,sizeof(m_stBaseData.cName)) ; m_bPlayerInfoDataDirty = true ; } SendMsg(&ret,sizeof(ret)) ; } break; case MSG_PLAYER_MODIFY_PHOTO: { stMsgPlayerModifyPhoto* pPhoto = (stMsgPlayerModifyPhoto*)pMsg ; m_stBaseData.nPhotoID = pPhoto->nPhotoID ; stMsgPlayerModifyPhotoRet msgRet ; msgRet.nRet = 0 ; SendMsg(&msgRet,sizeof(msgRet)) ; m_bPlayerInfoDataDirty = true ; } break; case MSG_PLAYER_MODIFY_SEX: { stMsgPlayerModifySex* pRet = (stMsgPlayerModifySex*)pMsg ; m_stBaseData.nSex = pRet->nNewSex ; stMsgPlayerModifySexRet msgback ; msgback.nRet = 0 ; SendMsg(&msgback,sizeof(msgback)) ; m_bPlayerInfoDataDirty = true ; LOGFMTI("change sex uid = %d , new sex = %d",GetPlayer()->GetUserUID(),pRet->nNewSex) ; } break; case MSG_PLAYER_UPDATE_MONEY: { stMsgPlayerUpdateMoney msgUpdate ; msgUpdate.nFinalCoin = GetAllCoin(); msgUpdate.nFinalDiamoned = GetAllDiamoned(); msgUpdate.nCupCnt = m_stBaseData.nCupCnt ; SendMsg(&msgUpdate,sizeof(msgUpdate)); } break; case MSG_GET_CONTINUE_LOGIN_REWARD: { // stMsgGetContinueLoginReward* pGetR = (stMsgGetContinueLoginReward*)pMsg ; // stMsgGetContinueLoginRewardRet msgBack ; // msgBack.nRet = 0 ; // // 0 success , 1 already getted , 2 you are not vip ; // msgBack.cRewardType = pGetR->cRewardType; // msgBack.nDayIdx = m_stBaseData.nContinueDays ; // msgBack.nDiamoned = GetAllDiamoned(); // msgBack.nFinalCoin = GetAllCoin() ; // if ( m_bGivedLoginReward ) // { // msgBack.nRet = 1 ; // SendMsgToClient((char*)&msgBack,sizeof(msgBack)) ; // break; // } // // stConLoginConfig* pConfig = CGameServerApp::SharedGameServerApp()->GetConfigMgr()->GetContinueLoginConfig()->GetConfigByDayIdx(m_stBaseData.nContinueDays) ; // if ( pConfig == NULL ) // { // LOGFMTE("there is no login config for dayIdx = %d",m_stBaseData.nContinueDays ) ; // msgBack.nRet = 4 ; // SendMsgToClient((char*)&msgBack,sizeof(msgBack)) ; // break; // } // // // give item deponed on nContinuedDays ; // if (pGetR->cRewardType == 1 ) // { // if ( GetVipLevel() < 1 ) // { // msgBack.nRet = 2 ; // SendMsgToClient((char*)&msgBack,sizeof(msgBack)) ; // break; // } // // give item ; // for ( int i = 0 ; i < pConfig->vItems.size(); ++i ) // { // CPlayerItemComponent* pc = (CPlayerItemComponent*)GetPlayer()->GetComponent(ePlayerComponent_PlayerItemMgr) ; // pc->AddItemByID(pConfig->vItems[i].nItemID,pConfig->vItems[i].nCount) ; // } // // give vip prize ; // m_stBaseData.nDiamoned += pConfig->nDiamoned ; // msgBack.nDiamoned = GetAllDiamoned(); // SendMsgToClient((char*)&msgBack,sizeof(msgBack)) ; // m_bGivedLoginReward = true ; // break; // } // else if( pGetR->cRewardType == 0 ) // { // // gvie common prize ; // m_stBaseData.nCoin += pConfig->nGiveCoin ; // msgBack.nFinalCoin = GetAllCoin() ; // SendMsgToClient((char*)&msgBack,sizeof(msgBack)) ; // m_bGivedLoginReward = true ; // break; // } // else // { // msgBack.nRet = 3 ; // SendMsgToClient((char*)&msgBack,sizeof(msgBack)) ; // break; // } } break; case MSG_PLAYER_REQUEST_CHARITY_STATE: { stMsgPlayerRequestCharityStateRet msgBack ; // 0 can get charity , 1 you coin is enough , do not need charity, 2 time not reached ; msgBack.nState = 0 ; // check times limit state ; time_t tNow = time(nullptr) ; struct tm pTimeCur, pTimeLast ; pTimeCur = *localtime(&tNow); time_t nLastTakeTime = m_stBaseData.tLastTakeCharityCoinTime; pTimeLast = *localtime(&nLastTakeTime); if ( pTimeCur.tm_year == pTimeLast.tm_year && pTimeCur.tm_yday == pTimeLast.tm_yday ) // the same day ; do nothing { } else { m_stBaseData.nTakeCharityTimes = 0 ; // new day reset times ; } msgBack.nLeftTimes = TIMES_GET_CHARITY_PER_DAY - m_stBaseData.nTakeCharityTimes ; if ( GetAllCoin() > COIN_CONDITION_TO_GET_CHARITY ) { msgBack.nState = 1 ; SendMsg(&msgBack,sizeof(msgBack)) ; break; } if ( m_stBaseData.nTakeCharityTimes >= TIMES_GET_CHARITY_PER_DAY ) { msgBack.nState = 2 ; SendMsg(&msgBack,sizeof(msgBack)) ; break; } SendMsg(&msgBack,sizeof(msgBack)) ; } break; case MSG_PLAYER_GET_CHARITY: { stMsgPlayerGetCharityRet msgBack ; // 0 success , 1 you coin is enough , do not need charity, 2 time not reached ; msgBack.nRet = 0 ; msgBack.nFinalCoin = GetAllCoin(); msgBack.nGetCoin = 0; msgBack.nLeftTimes = 0 ; if ( GetAllCoin() > COIN_CONDITION_TO_GET_CHARITY ) { msgBack.nRet = 1 ; SendMsg(&msgBack,sizeof(msgBack)) ; break; } // check times limit state ; time_t tNow = time(nullptr) ; struct tm pTimeCur ; struct tm pTimeLast ; pTimeCur = *localtime(&tNow); time_t nLastTakeTime = m_stBaseData.tLastTakeCharityCoinTime; pTimeLast = *localtime(&nLastTakeTime); if ( pTimeCur.tm_year == pTimeLast.tm_year && pTimeCur.tm_yday == pTimeLast.tm_yday ) // the same day ; do nothing { } else { m_stBaseData.nTakeCharityTimes = 0 ; // new day reset times ; } if ( m_stBaseData.nTakeCharityTimes >= TIMES_GET_CHARITY_PER_DAY ) { msgBack.nRet = 2 ; SendMsg(&msgBack,sizeof(msgBack)) ; break; } ++m_stBaseData.nTakeCharityTimes; msgBack.nGetCoin = COIN_FOR_CHARITY; msgBack.nLeftTimes = TIMES_GET_CHARITY_PER_DAY - m_stBaseData.nTakeCharityTimes ; m_stBaseData.tLastTakeCharityCoinTime = time(NULL) ; AddMoney(msgBack.nGetCoin); msgBack.nFinalCoin = GetAllCoin(); LOGFMTD("player uid = %d get charity",GetPlayer()->GetUserUID()); m_bCommonLogicDataDirty = true ; m_bMoneyDataDirty = true ; // save log stMsgSaveLog msgLog ; memset(msgLog.vArg,0,sizeof(msgLog.vArg)); msgLog.nJsonExtnerLen = 0 ; msgLog.nLogType = eLog_GetCharity ; msgLog.nTargetID = GetPlayer()->GetUserUID() ; memset(msgLog.vArg,0,sizeof(msgLog.vArg)) ; msgLog.vArg[0] = GetAllCoin() ; SendMsg(&msgLog,sizeof(msgLog)) ; LOGFMTI("uid = %d , final coin = %I64d",GetPlayer()->GetUserUID(),GetAllCoin()); SendMsg(&msgBack,sizeof(msgBack)) ; } break; default: { return false ; } break; } return true ; }
void G::AddCoin(int coinAdd){ setCoin(getCoin()+coinAdd); }
void ISitableRoom::onGameDidEnd() { for ( uint8_t nIdx = 0 ; nIdx < m_nSeatCnt ; ++nIdx ) { auto pPlayer = m_vSitdownPlayers[nIdx] ; if ( pPlayer == nullptr ) { continue; } if ( pPlayer->isHaveState(eRoomPeer_StayThisRound) && getDelegate() ) { getDelegate()->onUpdatePlayerGameResult(this,pPlayer->getUserUID(),pPlayer->getGameOffset()) ; LOGFMTD("update room peer offset uid = %u, offset = %d",pPlayer->getUserUID(),pPlayer->getGameOffset()); } if ( pPlayer->getNoneActTimes() >= getMaxNoneActTimeForStandUp() || (pPlayer->isDelayStandUp() || pPlayer->getCoin() < coinNeededToSitDown() || (getDelegate() && getDelegate()->isPlayerLoseReachMax(this,pPlayer->getUserUID())) ) ) { playerDoStandUp(pPlayer); pPlayer = nullptr ; m_vSitdownPlayers[nIdx] = nullptr ; } if ( pPlayer ) { pPlayer->onGameEnd() ; } } m_vSortByPeerCardsAsc.clear(); IRoom::onGameDidEnd() ; }
bool ISitableRoom::onMessage( stMsg* prealMsg , eMsgPort eSenderPort , uint32_t nPlayerSessionID ) { if ( IRoom::onMessage(prealMsg,eSenderPort,nPlayerSessionID) ) { return true ; } switch ( prealMsg->usMsgType ) { case MSG_REQ_CUR_GAME_OFFSET: { auto pPlayer = getSitdownPlayerBySessionID(nPlayerSessionID) ; if ( pPlayer ) { stMsgReqRobotCurGameOffsetRet msgback ; msgback.nCurGameOffset = pPlayer->getTotalGameOffset(); sendMsgToPlayer(&msgback,sizeof(msgback),nPlayerSessionID) ; LOGFMTD("robot req cur offset = %d , uid = %u",msgback.nCurGameOffset,pPlayer->getUserUID()); } } break; case MSG_ADD_TEMP_HALO: { auto pPlayer = getPlayerBySessionID(nPlayerSessionID) ; if ( pPlayer == nullptr ) { LOGFMTE("not in room player add temp halo session id = %u",nPlayerSessionID); break; } //if ( pPlayer->nPlayerType == ePlayer_Normal ) //{ // LOGFMTE("normal can not add temp halo"); // break; //} stMsgAddTempHalo* pRet = (stMsgAddTempHalo*)prealMsg ; if ( 0 == pRet->nTargetUID ) { pRet->nTargetUID = pPlayer->nUserUID ; } auto psitpp = getSitdownPlayerByUID(pRet->nTargetUID) ; if ( psitpp ) { psitpp->setTempHaloWeight(pRet->nTempHalo); LOGFMTD("uid = %u add temp halo = %u",pRet->nTargetUID,pRet->nTempHalo) ; } else { LOGFMTE("uid = %u not sit down why add temp halo",pPlayer->nUserUID); } } break; case MSG_PLAYER_SITDOWN: { stMsgPlayerSitDownRet msgBack ; msgBack.nRet = 0 ; stStandPlayer* pPlayer = getPlayerBySessionID(nPlayerSessionID) ; if ( !pPlayer ) { LOGFMTE("palyer session id = %d ,not in this room so , can not sit down",nPlayerSessionID) ; msgBack.nRet = 3 ; sendMsgToPlayer(&msgBack,sizeof(msgBack),nPlayerSessionID) ; break; } auto pp = getSitdownPlayerByUID(pPlayer->nUserUID); if ( pp ) { LOGFMTE("session id = %d , already sit down , don't sit down again",nPlayerSessionID ) ; msgBack.nRet = 4 ; sendMsgToPlayer(&msgBack,sizeof(msgBack),nPlayerSessionID) ; break; } stMsgPlayerSitDown* pRet = (stMsgPlayerSitDown*)prealMsg ; if ( pRet->nTakeInCoin == 0 || pRet->nTakeInCoin > pPlayer->nCoin) { pRet->nTakeInCoin = pPlayer->nCoin ; } if ( pRet->nTakeInCoin < coinNeededToSitDown() ) { msgBack.nRet = 1 ; sendMsgToPlayer(&msgBack,sizeof(msgBack),nPlayerSessionID) ; break; } if ( isSeatIdxEmpty(pRet->nIdx) == false ) { msgBack.nRet = 2 ; sendMsgToPlayer(&msgBack,sizeof(msgBack),nPlayerSessionID) ; break; } auto sitDownPlayer = getReuseSitableRoomPlayerObject() ; sitDownPlayer->reset(pPlayer) ; pPlayer->nCoin -= pRet->nTakeInCoin ; sitDownPlayer->setCoin(pRet->nTakeInCoin) ; sitDownPlayer->doSitdown(pRet->nIdx) ; sitDownPlayer->setIdx(pRet->nIdx); sitDownPlayer->setState(eRoomPeer_WaitNextGame ); m_vSitdownPlayers[pRet->nIdx] = sitDownPlayer ; // tell others ; stMsgRoomSitDown msgSitDown ; msgSitDown.nIdx = sitDownPlayer->getIdx() ; msgSitDown.nSitDownPlayerUserUID = sitDownPlayer->getUserUID() ; msgSitDown.nTakeInCoin = sitDownPlayer->getCoin() ; sendRoomMsg(&msgSitDown,sizeof(msgSitDown)); onPlayerSitDown(sitDownPlayer) ; if ( pPlayer->nPlayerType == ePlayer_Robot ) { LOGFMTD("robot uid = %d enter room",sitDownPlayer->getUserUID()) ; m_pRobotDispatchStrage->onRobotJoin(sitDownPlayer->getSessionID()); } } break; case MSG_PLAYER_STANDUP: { stMsgPlayerStandUpRet msgBack ; msgBack.nRet = 0 ; auto player = getSitdownPlayerBySessionID(nPlayerSessionID) ; if ( player == nullptr ) { msgBack.nRet = 1 ; sendMsgToPlayer(&msgBack,sizeof(msgBack),nPlayerSessionID) ; break; } onPlayerWillStandUp(player); } break; default: return false; } return true ; }