void CMail::CodeToDataBlockForClient(DBWriteSet& setWriteDB,CPlayer *pPlayer) { time_t t_CurrentTime = time(NULL); DWORD dwRemainTime = 0; if (GetRemainTime() - t_CurrentTime>0) { dwRemainTime = (DWORD)(GetRemainTime() - t_CurrentTime); } setWriteDB.AddToByteArray(GetExID()); //邮件的ID setWriteDB.AddToByteArray(dwRemainTime);//邮件的有效时间 setWriteDB.AddToByteArray((DWORD)GetGold());//操作的金钱数 setWriteDB.AddToByteArray(GetSubject().c_str());//邮件名称 setWriteDB.AddToByteArray(GetText().c_str());//邮件内容 setWriteDB.AddToByteArray(GetExText().c_str());//邮件附加内容 setWriteDB.AddToByteArray(GetWriter().c_str());//邮件发送者名称 setWriteDB.AddToByteArray((BYTE)GetRead()); //是否阅读过 setWriteDB.AddToByteArray((BYTE)GetType()); //类型 setWriteDB.AddToByteArray((BYTE)GetReject()); //退信标志符 // setWriteDB.AddToByteArray((long)GetSGood().size()); // if (GetSGood().size()>0 && GetType()==REQUEST_MAIL) // { // for (list<tagSGoods*>::iterator it=GetSGood().begin(); it!=GetSGood().end(); ++it) // { // setWriteDB.AddToByteArray((long)(*it)->lIndex); // setWriteDB.AddToByteArray((long)(*it)->lNum); // } // } // else // { setWriteDB.AddToByteArray((long)GetMGoodsContainer().size()); for (vector<CGoods*>::iterator it=GetMGoodsContainer().begin(); it!=GetMGoodsContainer().end(); ++it) { (*it)->SerializeForOldClient(setWriteDB); } // } }
//为客户端编码 void CMail::AddToByteArrayForClient(vector<BYTE>& vRet,CPlayer *pPlayer) { time_t t_CurrentTime = time(NULL); DWORD dwRemainTime = 0; if (GetRemainTime() - t_CurrentTime>0) { dwRemainTime = (DWORD)(GetRemainTime() - t_CurrentTime); } _AddToByteArray(&vRet,GetExID()); //邮件的ID _AddToByteArray(&vRet,dwRemainTime); //邮件的有效时间 _AddToByteArray(&vRet,(DWORD)GetGold());//操作的金钱数 _AddToByteArray(&vRet,GetSubject().c_str());//邮件名称 _AddToByteArray(&vRet,GetText().c_str()); //邮件内容 _AddToByteArray(&vRet,GetExText().c_str()); //邮件附加内容 _AddToByteArray(&vRet,GetWriter().c_str()); //邮件发送者名称 _AddToByteArray(&vRet,(BYTE)GetRead()); //是否阅读过 _AddToByteArray(&vRet,(BYTE)GetType()); //类型 _AddToByteArray(&vRet,(BYTE)GetReject()); //退信标志符 // _AddToByteArray(&vRet,(long)GetSGood().size()); // if (GetSGood().size()>0 && GetType()==REQUEST_MAIL) // { // for (list<tagSGoods*>::iterator it=GetSGood().begin(); it!=GetSGood().end(); ++it) // { // _AddToByteArray(&vRet,(long)(*it)->lIndex); // _AddToByteArray(&vRet,(long)(*it)->lNum); // } // } // else // { _AddToByteArray(&vRet,(long)GetMGoodsContainer().size()); for (vector<CGoods*>::iterator it=GetMGoodsContainer().begin(); it!=GetMGoodsContainer().end(); ++it) { (*it)->SerializeForOldClient(&vRet); } // } }
void CMail::AddToByteArrayForWS(vector<BYTE>& vRet,CPlayer* pPlayer) { _AddToByteArray(&vRet,GetExID()); //邮件Guid _AddToByteArray(&vRet,(char*)GetWriter().c_str()); //邮件写信人 _AddToByteArray(&vRet,(char*)GetSubject().c_str()); //主题 _AddToByteArray(&vRet,(char*)GetText().c_str()); //邮件内容 _AddToByteArray(&vRet,(char*)GetExText().c_str()); //邮件附加内容 _AddToByteArray(&vRet,(BYTE)GetRead()); //读取标志符 _AddToByteArray(&vRet,(BYTE)GetType()); //邮件类型 _AddToByteArray(&vRet,(long)GetGold()); //金钱 _AddToByteArray(&vRet,(DWORD) GetRemainTime()); //保存时间 _AddToByteArray(&vRet,(BYTE)GetReject()); //退信标志符 //收信人 _AddToByteArray(&vRet,(char*)pPlayer->GetName()); //增值物品列表 // long lSGoodNum = (long)GetSGood().size(); // _AddToByteArray(&vRet,lSGoodNum); // for (list<tagSGoods*>::iterator it=GetSGood().begin(); it!=GetSGood().end(); ++it) // { // _AddToByteArray(&vRet,(*it)->lIndex); // _AddToByteArray(&vRet,(*it)->lNum); // } //普通物品列表 long lCGoodNum = (long)GetMGoodsContainer().size(); _AddToByteArray(&vRet,lCGoodNum); int nPos = 0; vector<BYTE> pBA; for (vector<CGoods*>::iterator it=GetMGoodsContainer().begin(); it!=GetMGoodsContainer().end(); ++it) { (*it)->Serialize(&pBA); _AddToByteArray(&vRet,(LONG)pBA.size()); if (pBA.size()) _AddToByteArray(&vRet,&pBA[0], (long)pBA.size()); } }
void BattleUI::InitHeroUI() { ArmatureDataManager::getInstance()->addArmatureFileInfo("Texiao.ExportJson"); auto layout_Bottom = m_RootWidget->getChildByName<Layout*>("Layout_Bottom"); auto text_HeroText = layout_Bottom->getChildByName<Text*>("Text_HeroText"); auto langId = (int)LanguageIdEnum::SelfLangId; auto langText = MultiLanguage::getInstance()->GetText(langId); text_HeroText->setString(langText); auto lbar_HeroHp = layout_Bottom->getChildByName<LoadingBar*>("LBar_HeroHp"); lbar_HeroHp->setPercent(100); //自动或手动控制战斗 auto btn_Auto = layout_Bottom->getChildByName<Button*>("Btn_Auto"); auto btn_UnAuto = layout_Bottom->getChildByName<Button*>("Btn_UnAuto"); if (BattleData::getInstance()->m_HeroAutoAttack) { btn_Auto->setVisible(true); btn_UnAuto->setVisible(false); }else { btn_Auto->setVisible(false); btn_UnAuto->setVisible(true); } langId = (int)LanguageIdEnum::AutoAttackLangId; langText = MultiLanguage::getInstance()->GetText(langId); btn_Auto->setTitleText(langText); btn_UnAuto->setTitleText(langText); btn_Auto->addClickEventListener([=](Ref* sender) { btn_Auto->setVisible(false); btn_UnAuto->setVisible(true); BattleData::getInstance()->m_HeroAutoAttack = false; UserData::getInstance()->Update_Value(UserDataEnum::AutoAttack, Value(0)); }); btn_UnAuto->addClickEventListener([=](Ref* sender) { btn_Auto->setVisible(true); btn_UnAuto->setVisible(false); for (auto pb : *m_VecProgressBar) pb->Resume(); BattleData::getInstance()->m_HeroAutoAttack = true; UserData::getInstance()->Update_Value(UserDataEnum::AutoAttack, Value(1) ); }); auto btn_Bread = layout_Bottom->getChildByName<Button*>("Btn_Bread"); auto text_BreadName = btn_Bread->getChildByName<Text*>("Text_BreadNAME"); langId = (int)LanguageIdEnum::BreadLangId; langText = MultiLanguage::getInstance()->GetText(langId); text_BreadName->setString(langText); auto text_Bread = btn_Bread->getChildByName<Text*>("Text_Bread"); auto bread_Num = 0; auto breadData = UserData::getInstance()->Get_MVI_Value(UserDataEnum::BackPack, (int)CfgIdEnum::BreadId); if(breadData != Value::Null) bread_Num = breadData.asInt(); text_Bread->setString(StringUtils::format("%d", bread_Num)); auto lbar_Bread = btn_Bread->getChildByName<LoadingBar*>("LBar_Bread"); string pbName = "BreadHpSchedule"; auto progressBar = new ProgressBar(); progressBar->SetTotalTime(3); //3秒吃一个面包 progressBar->SetScheduleName(pbName); progressBar->SetLoadingBar(lbar_Bread); m_VecProgressBar->push_back(progressBar); progressBar->SetCallBack([this, progressBar]() { progressBar->Restart(); progressBar->GetLoadingBar()->setPercent(0); m_RootWidget->unschedule(progressBar->GetScheduleName()); }); btn_Bread->addClickEventListener([=](Ref* sender) { auto bread_Num = 0; auto breadData = UserData::getInstance()->Get_MVI_Value(UserDataEnum::BackPack, (int)CfgIdEnum::BreadId); if(breadData != Value::Null) bread_Num = breadData.asInt(); if (bread_Num == 0) { auto langId = (int)LanguageIdEnum::BreadNotEnoughId; auto langText = MultiLanguage::getInstance()->GetText(langId); MoveText::getInstance()->AddDefaultTextData(m_RootWidget, langText); }else { if(progressBar->GetRemainTime() == progressBar->GetTotalTime()) { auto bread_Num = UserData::getInstance()->Update_VMI_Fun( UserDataEnum::BackPack, (int)CfgIdEnum::BreadId, -1); if (bread_Num >= 0) { text_Bread->setString(StringUtils::format("%d", bread_Num)); //回血 BattleData::getInstance()->BreadRevertHp(); m_RootWidget->schedule([this, progressBar](float f) { progressBar->Update(f); }, progressBar->GetScheduleName()); } } AchievementSystem::getInstance()->CheckAchievement(UserEventType::BattleEatBread, 1); } }); vector<pair<int, int> >heroVec; BattlePubUI::getInstance()->GetBackPackHero(&heroVec); auto idx = 0; //创建英雄技能 for (auto heroData : heroVec) { auto heroId = heroData.first; auto heroNum = heroData.second; for (auto i = 0; i < heroNum ; i++) { CreateHeroEvent(heroId, idx); idx++; } } auto talentTeamTotalHp = BattleData::getInstance()->m_TalentTeamTotalHp; auto text_HeroHp = layout_Bottom->getChildByName<Text*>("Text_HeroHp"); text_HeroHp->setString(StringUtils::format("%d/%d", talentTeamTotalHp, talentTeamTotalHp)); BattleData::getInstance()->m_HeroHpLBar = lbar_HeroHp; BattleData::getInstance()->m_TextHeroHp = text_HeroHp; }
//英雄显示位置 void BattleUI::CreateHeroEvent(int cfgId, int idx) { auto layout_Bottom = m_RootWidget->getChildByName<Layout*>("Layout_Bottom"); string btn_Name = StringUtils::format("Btn_Skill%d", idx); auto Btn_Hero = layout_Bottom->getChildByName<Button*>(btn_Name); Btn_Hero->setVisible(true); auto lbar_Name = StringUtils::format("LBar_State%d", idx); auto lbar_State = Btn_Hero->getChildByName<LoadingBar*>(lbar_Name); lbar_State->setPercent(100); CfgDataRow dataRow(cfgId); auto textName = StringUtils::format("Text_Name%d", idx); auto text_Name = Btn_Hero->getChildByName<Text*>(textName); auto skillId = dataRow.GetValue(CfgField::SkillID_V)->asValueVector().begin()->asInt(); CfgDataRow skillDataRow(skillId); auto langId = skillDataRow.GetValue(CfgField::Name)->asInt(); auto langText = MultiLanguage::getInstance()->GetText(langId); text_Name->setString(langText); auto attack_Speed = dataRow.GetValue(CfgField::Spd_F)->asFloat(); attack_Speed = 10 / attack_Speed; Armature* armature = CreateHeroArmature(cfgId); string pbName = StringUtils::format("HeroSkillSchedule%d", idx); auto playName = skillDataRow.GetValue(CfgField::SkillAtksfxID_S)->asString(); auto isGetKong = UserData::getInstance()->Check_VI_Fun(UserDataEnum::TalentList, Value((int)CfgIdEnum::TalentEliminateCD)); auto progressBar = new ProgressBar(); progressBar->SetScheduleName(pbName); progressBar->SetTotalTime(attack_Speed, isGetKong); progressBar->SetLoadingBar(lbar_State); m_VecProgressBar->push_back(progressBar); progressBar->SetCallBack([=]() { progressBar->Restart(); if (armature->getAnimation()->getAnimationData()->getMovement(playName) == nullptr) { CCLOGERROR("Armature:%s, not %s", armature->getName().c_str(), playName.c_str()); }else if(m_IsPlayAnim) { armature->setVisible(true); armature->getAnimation()->play(playName); } if (m_MonsterArmature != nullptr && m_IsPlayAnim) { m_MonsterArmature->getAnimation()->play(m_Beating); } auto attackResult = BattleData::getInstance()->HeroAttack(cfgId); if (attackResult == -1) { BattleFinish(true); }else if(attackResult > 0) { BufferEffect(attackResult); } if (!BattleData::getInstance()->m_HeroAutoAttack) { m_RootWidget->unschedule(pbName); } }); Btn_Hero->addClickEventListener([this, progressBar, pbName](Ref* sender) { if(progressBar->GetRemainTime() == progressBar->GetTotalTime()) { m_RootWidget->schedule([this, progressBar](float f) { progressBar->Update(f); }, pbName); } }); m_RootWidget->schedule([this, progressBar](float f) { progressBar->Update(f); }, pbName); if (BattleData::getInstance()->m_HeroAutoAttack) { progressBar->Resume(); } UIUtils::getInstance()->showProperImg(Btn_Hero, cfgId); }
/** * @brief 获取或填充基础信息 */ void CSoMJFrameLogic::GetViewInfoMsg( UINT shPlayerID, bool bWatchUser, TCMD_NOTIFY_VIEW_INFO* pCmd) { if (NULL == m_pSoUserMgr || NULL == m_pSoGameProcessor || NULL == m_pStateEvent || NULL == pCmd) { return ; } ISoPlayer* pSoPlayer = m_pSoUserMgr->GetPlayerByID(shPlayerID); if (NULL == pSoPlayer) { return ; } int i, j, k; UINT ucChairID = pSoPlayer->GetChairID(); pCmd->ucDealer = m_nDealer; pCmd->ucWindRound = m_nWindRound; pCmd->ucWindRoundNbr = m_nWindRoundNbr; pCmd->ucCurTurn = m_nNowTurn; pCmd->ucWallLength = m_TilesDealer.CurrentLength(); pCmd->ucNowTime = GetRemainTime(); pCmd->ucGameState = m_pStateEvent->GetMJState(); pCmd->ucBLookOn = pSoPlayer->GetBCanBeLookedOn(); pCmd->ucLastTile = m_ucLastTile; pCmd->ucLastGiveChair = m_byLastChair; pCmd->ucDice[0] = m_nDice[0]; pCmd->ucDice[1] = m_nDice[1]; pCmd->ucDarwTileLength = m_TilesDraw.CurrentLength(); pCmd->ucGangTileLength = m_TilesGang.CurrentLength(); for (i = 0; i < 4; i++) { ISoPlayer* pUser = m_pSoUserMgr->GetPlayerByChair(i); if (pUser == NULL) { continue ; } // 准备状态 pCmd->ucReady[i] = pUser->IsReady() ? 1 : 0; // 托管状态 pCmd->ucTrusteeFlag[i] = pUser->GetTrusteeStatusVal() ? 1 : 0; } // 添加手牌、出牌、拦牌牌数据长度 for (i = 0; i < 4; i++) { pCmd->ucHandTilesLength[i] = m_TilesHand[i].CurrentLength(); pCmd->ucGiveTilesLength[i] = m_TilesGive[i].CurrentLength(); pCmd->ucSetTilesLength[i] = m_TilesSet[i].CurrentLength(); } // 添加花牌数据 for (i = 0; i < MJ_FLOWER_NBR; i++) { pCmd->ucFlower[i] = m_nFlower[i]; } // 添加手牌数据 for (i = 0; i < pCmd->ucHandTilesLength[ucChairID]; i++) { if (pSoPlayer->GetChairID() == ucChairID) { // 游戏玩家 或 可以旁观状态 if (bWatchUser && !pCmd->ucBLookOn) { pCmd->ucHandTiles[i] = TILE_BEGIN; } else { pCmd->ucHandTiles[i] = m_TilesHand[ucChairID].GetTile(i); } } else { // 其他玩家 或 旁观玩家不能看牌 pCmd->ucHandTiles[i] = TILE_BEGIN; } } TILE_SET tileSet; // 添加拦牌与出牌数据 for (i = 0; i < 4; i++) { k = 0; // 添加拦牌 for (j = 0; j < pCmd->ucSetTilesLength[i]; j++) { m_TilesSet[i].GetSet(j, tileSet); // 复制拦牌数据 for (k = 0; k < 4; k++) { if (ACTION_QUADRUPLET_CONCEALED == tileSet.m_ucFlag) { // 如果是暗杠, 则需要判断旁观玩家进入时是否可以观看 if (GetMJSetting().nAnGangShow == 1) { pCmd->ucBlockTiles[i][j * 4 + k] = tileSet.m_ucTile[k]; } else if (i == ucChairID) { if (bWatchUser && !pCmd->ucBLookOn) { // 旁观不能看杠牌 pCmd->ucBlockTiles[i][j * 4 + k] = TILE_BEGIN; } else { pCmd->ucBlockTiles[i][j * 4 + k] = tileSet.m_ucTile[k]; } } else { // 不可以看到暗杠牌 pCmd->ucBlockTiles[i][j * 4 + k] = TILE_BEGIN; } } else { pCmd->ucBlockTiles[i][j * 4 + k] = tileSet.m_ucTile[k]; } } // 拦牌类型 pCmd->ucBlockTilesFlag[i][j] = tileSet.m_ucFlag; // 拦的谁的牌, 或是拦的哪一张(针对吃牌有效) pCmd->ucBlockTilesWhich[i][j] = tileSet.m_ucChair; } // 添加出牌 for (j = 0; j < pCmd->ucGiveTilesLength[i]; j++) { pCmd->ucGiveTiles[i][j] = m_TilesGive[i].GetTile(j); m_TilesGive[i].GetBlock(j, tileSet); if (tileSet.m_ucFlag == ACTION_TING) { pCmd->bGiveTingTiles[i][j] = TRUE; pCmd->bGiveBlockTiles[i][j] = FALSE; } else if (tileSet.m_ucFlag != ACTION_EMPTY) { pCmd->bGiveTingTiles[i][j] = FALSE; pCmd->bGiveBlockTiles[i][j] = TRUE; } else { pCmd->bGiveTingTiles[i][j] = FALSE; pCmd->bGiveBlockTiles[i][j] = FALSE; } } } // 添加万能牌数量 pCmd->ucGodTilesLength = m_TilesGod.CurrentLength(); for (i = 0; i < pCmd->ucGodTilesLength; i++) { pCmd->ucGodTiles[i] = m_TilesGod.GetTile(i); } for (i = 0; i < 4; i++) { // 玩家花牌数量 pCmd->ucFlowerNbr[i] = GetFlowerNbr(i); // 玩家听牌类型 pCmd->ucTingType[i] = m_nTingType[i]; } // 当前玩家状态是听牌状态, 则需要计算听牌后可以胡的牌数据 if (m_nTingType[ucChairID] != MJ_TING_NONE) { CMJHand tmpHand; CMJHand mjTestHand = m_TilesHand[ucChairID]; if (mjTestHand.CurrentLength() % 2 == 0) { // 需要删除当前摸的牌 mjTestHand.DelTile(GetLastTile()); } GetTingTiles( mjTestHand, m_TilesSet[ucChairID], tmpHand ); // 打出的牌后可以胡哪些牌 for (i = 0; i < tmpHand.CurrentLength() && i < 20; i++) { pCmd->ucTingTiles[i] = tmpHand.GetTile(i); } } }