uint WGGuildReturnHandler::Execute( WGGuildReturn* pPacket, Player* pPlayer ) { __ENTER_FUNCTION PlayerID_t PlayerID = pPacket->GetPlayerID(); GamePlayer* pGamePlayer = g_pPlayerPool->GetPlayer(PlayerID); if( pGamePlayer==NULL ) { Assert(FALSE); return PACKET_EXE_CONTINUE; } Obj_Human* pHuman = pGamePlayer->GetHuman(); Assert( pHuman ); Scene* pScene = pHuman->getScene(); if( pScene==NULL ) return PACKET_EXE_CONTINUE ; if( pPlayer->IsServerPlayer() ) {//服务器收到世界服务器发来的数据 Assert( MyGetCurrentThreadID()==g_pServerManager->m_ThreadID ); pScene->SendPacket( pPacket, PlayerID ); g_pLog->FastSaveLog( LOG_FILE_1, "WGGuildReturnHandler: ServerPlayer (ReturnType=%d) ", pPacket->GetGuildReturn()->m_ReturnType ); return PACKET_EXE_NOTREMOVE; } else if( pPlayer->IsGamePlayer() ) {//场景收到Cache里的消息 Assert( MyGetCurrentThreadID()==pScene->m_ThreadID ); GUILD_RETURN_TYPE ReturnType = (GUILD_RETURN_TYPE)pPacket->GetGuildReturn()->m_ReturnType; switch( ReturnType ) { case GUILD_RETURN_RESPONSE: { if( pPacket->GetGuildReturn()->m_GUID != pHuman->GetGUID() ) { break; } } /* go through */ case GUILD_RETURN_CREATE: { pHuman->SetGuildID( pPacket->GetGuildReturn()->m_GuildID ); CHAR zsMsgBangPaiTitle[MAX_NICK_NAME] = {0}; sprintf(zsMsgBangPaiTitle, "%s帮主",pPacket->GetGuildReturn()->m_GuildName); pHuman->SetCurGuildTitle(GUANZHI_TITLE_ID); pHuman->SetGuildTitleName(zsMsgBangPaiTitle, (BYTE)strlen(zsMsgBangPaiTitle)); pHuman->UpdateTitlesToClient(); } break; case GUILD_RETURN_JOIN: { // 给玩家设上 GuildID pHuman->SetGuildID( INVALID_ID ); } break; case GUILD_RETURN_INVIT://邀请加入帮会的返回结果 { pHuman->SetGuildID(pPacket->GetGuildReturn()->m_GuildID); //给与称号 if( pPacket->GetGuildReturn()->m_GUID == pHuman->GetGUID() ) { CHAR zsMsgBangPaiTitle[MAX_NICK_NAME] = {0}; sprintf(zsMsgBangPaiTitle, "%s帮众",pPacket->GetGuildReturn()->m_GuildName); pHuman->SetCurGuildTitle(GUANZHI_TITLE_ID); pHuman->SetGuildTitleName(zsMsgBangPaiTitle, (BYTE)strlen(zsMsgBangPaiTitle)); pHuman->UpdateTitlesToClient(); pHuman->SetGuildID( pPacket->GetGuildReturn()->m_GuildID ); } } break; case GUILD_RETURN_EXPEL: case GUILD_RETURN_LEAVE: { if( pPacket->GetGuildReturn()->m_GUID == pHuman->GetGUID() ) { CHAR zsMsgBangPaiTitle[MAX_NICK_NAME] = {0}; pHuman->SetGuildID( INVALID_ID ); pHuman->SetGuildTitleName(zsMsgBangPaiTitle, (BYTE)strlen(zsMsgBangPaiTitle)); HumanDB* pHumanDB = pHuman->GetDB(); if (pHumanDB) { pHumanDB->SetLeaveGuildTime(g_pTimeManager->GetANSITime()); pHumanDB->RemoveTitle(BANGPAI_TITLE_ID); pHumanDB->RemoveTitle(GUANZHI_TITLE_ID); } pHuman->UpdateTitlesToClient(); } } break; case GUILD_RETURN_RECRUIT: {//给与称号 if( pPacket->GetGuildReturn()->m_GUID == pHuman->GetGUID() ) { CHAR zsMsgBangPaiTitle[MAX_NICK_NAME] = {0}; sprintf(zsMsgBangPaiTitle, "%s帮众",pPacket->GetGuildReturn()->m_GuildName); pHuman->SetCurGuildTitle(BANGPAI_TITLE_ID); pHuman->SetGuildTitleName(zsMsgBangPaiTitle, (BYTE)strlen(zsMsgBangPaiTitle)); pHuman->UpdateTitlesToClient(); pHuman->SetGuildID( pPacket->GetGuildReturn()->m_GuildID ); } } break; case GUILD_RETURN_PROMOTE: case GUILD_RETURN_DEMOTE: { if( pPacket->GetGuildReturn()->m_GUID == pHuman->GetGUID() ) { CHAR zsMsgBangPaiTitle[MAX_NICK_NAME] = {0}; sprintf(zsMsgBangPaiTitle, "%s%s", pPacket->GetGuildReturn()->m_GuildName, pPacket->GetGuildReturn()->m_PositionName); pHuman->SetGuildTitleName(zsMsgBangPaiTitle, (BYTE)strlen(zsMsgBangPaiTitle)); pHuman->UpdateTitlesToClient(); } } break; case GUILD_RETURN_DEMISE: { if( pPacket->GetGuildReturn()->m_GUID == pHuman->GetGUID() ) { CHAR zsMsgBangPaiTitle[MAX_NICK_NAME] = {0}; sprintf(zsMsgBangPaiTitle, "%s%s", pPacket->GetGuildReturn()->m_GuildName, pPacket->GetGuildReturn()->m_PositionName); pHuman->SetGuildTitleName(zsMsgBangPaiTitle, (BYTE)strlen(zsMsgBangPaiTitle)); pHuman->UpdateTitlesToClient(); } else if(pPacket->GetGuildReturn()->m_GUIDChanged == pHuman->GetGUID() ) { CHAR zsMsgBangPaiTitle[MAX_NICK_NAME] = {0}; sprintf(zsMsgBangPaiTitle, "%s%s", pPacket->GetGuildReturn()->m_GuildName, pPacket->GetGuildReturn()->m_ChangedPositionName); pHuman->SetGuildTitleName(zsMsgBangPaiTitle, (BYTE)strlen(zsMsgBangPaiTitle)); pHuman->UpdateTitlesToClient(); } } break; case GUILD_RETURN_AUTHORIZE: case GUILD_RETURN_DEPRIVE_AUTHORITY: case GUILD_RETURN_WITHDRAW: case GUILD_RETURN_DEPOSIT: case GUILD_RETURN_FOUND: case GUILD_RETURN_REJECT: case GUILD_RETURN_ALREADY_IN: break; case GUILD_RETURN_LEVEL_UP: { //失败的话 得返还扣除的金钱 if (!pPacket->GetGuildReturn()->m_bScuess) { INT nLevel = pPacket->GetGuildReturn()->m_GuildLevel; ++nLevel; Assert(nLevel < MAX_GUILD_LEVEL); INT nMoney = pHuman->GetMoney() + g_GuildLevelInfoTbl.m_TableInfo[nLevel].m_Gold; pHuman->SetMoney(nMoney); } else//把帮会人数上限,黄金家族,家族数等信息同步到GL { INT nLevel = pPacket->GetGuildReturn()->m_GuildLevel; GUILD_CGW_LEVELINFO levelInfo; levelInfo.m_MaxUser = g_GuildLevelInfoTbl.m_TableInfo[nLevel].m_MaxGuildUser; levelInfo.m_MaxFamily = g_GuildLevelInfoTbl.m_TableInfo[nLevel].m_MaxFamily; levelInfo.m_MaxGoldFamilyUser = g_GuildLevelInfoTbl.m_TableInfo[nLevel].m_MaxGoldFamilyUser; GWGuild* pMsg = (GWGuild*)g_pPacketFactoryManager->CreatePacket(PACKET_GW_GUILD); pMsg->SetGUID(pHuman->GetGUID()); pMsg->SetGuildPacket((_GUILD_CGW_PACKET*)&levelInfo); pMsg->GetGuildPacket()->m_uPacketType = GUILD_PACKET_GW_LEVEL_INFO; g_pServerManager->SendPacket( pMsg, INVALID_ID ); } } break; case GUILD_RETURN_DISMISS: { // 这里以后还得处理离线玩家称号的情况,现在无解 pHuman->SetGuildID( INVALID_ID ); pHuman->SetGuildTitleName("", 0); HumanDB* pHumanDB = pHuman->GetDB(); if (pHumanDB) { pHumanDB->RemoveTitle(BANGPAI_TITLE_ID); pHumanDB->RemoveTitle(GUANZHI_TITLE_ID); } pHuman->UpdateTitlesToClient(); } break; case GUILD_RETURN_CREATE_FAILED: { pHuman->SetMoney(pHuman->GetMoney()+GUILD_CREATE_MONEY_LIMIT); MONEY_LOG_PARAM MoneyLogParam; MoneyLogParam.CharGUID = pHuman->GetGUID(); MoneyLogParam.OPType = MONEY_GUILD_CREATE_COST; MoneyLogParam.Count = GUILD_CREATE_MONEY_LIMIT; MoneyLogParam.SceneID = pHuman->getScene()->SceneID(); MoneyLogParam.XPos = pHuman->getWorldPos()->m_fX; MoneyLogParam.ZPos = pHuman->getWorldPos()->m_fZ; SaveMoneyLog(&MoneyLogParam); ITEM_LOG_PARAM ItemLogParam; ItemLogParam.OpType = ITEM_SYSTEM_GIVE_BACK; BOOL bScuess = HumanItemLogic::CreateMultiItemToBag(&ItemLogParam, pHuman, GUILD_CREATE_ITEM_INDEX, 1); if(!bScuess) { g_pLog->FastSaveLog( LOG_FILE_1, "WGGuildReturnHandler: GamePlayer (ReturnType=%d),Create Item failed![GUID=%d] ", pPacket->GetGuildReturn()->m_ReturnType, pHuman->GetGUID()); } } break; case GUILD_RETURN_ADD_FAMILY_USER: { } break; case GUILD_RETURN_BEADD_FAMILY: { pHuman->SetFamilyID(pPacket->GetGuildReturn()->m_cFamilyID); } break; case GUILD_RETURN_REMOVE_FAMILY_USER: { } break; case GUILD_RETURN_CREATE_FAMILY: { pHuman->SetFamilyID(pPacket->GetGuildReturn()->m_cFamilyID); } break; case GUILD_RETURN_MODIFY_DESC: { } break; case GUILD_RETURN_FAMILY_DISMISS: { } break; default: Assert(FALSE); return 0; } GCGuildReturn Msg; Msg.SetGuildReturn( pPacket->GetGuildReturn() ); pGamePlayer->SendPacket( &Msg ); g_pLog->FastSaveLog( LOG_FILE_1, "WGGuildReturnHandler: GamePlayer (ReturnType=%d) ", pPacket->GetGuildReturn()->m_ReturnType ); } else { Assert(FALSE); } return PACKET_EXE_CONTINUE; __LEAVE_FUNCTION return PACKET_EXE_ERROR; }
uint CGShopBuyHandler::Execute( CGShopBuy* pPacket, Player* pPlayer ) { __ENTER_FUNCTION GamePlayer* pGamePlayer = (GamePlayer*)pPlayer ; Assert( pGamePlayer ) ; Obj_Human* pHuman = pGamePlayer->GetHuman() ; Assert( pHuman ) ; Scene* pScene = pHuman->getScene() ; if( pScene==NULL ) { Assert(FALSE) ; return PACKET_EXE_ERROR ; } //检查线程执行资源是否正确 Assert( MyGetCurrentThreadID()==pScene->m_ThreadID ) ; BYTE m_nndex = pPacket->GetIndex(); //资源位置索引 UINT UniqueID = pPacket->GetUniqueID(); SceneID_t SceneID = UniqueID>>16; ObjID_t NpcObjID= UniqueID&0x00ff; //距离判定 Obj* pNpcObj = (Obj*) (pScene->GetObjManager()->GetObj(NpcObjID)); if(pNpcObj == NULL) { g_pLog->FastSaveLog( LOG_FILE_1, "CGShopBuyHandler Illegal Obj") ; return PACKET_EXE_CONTINUE ; } FLOAT fDist = MySqrt(pNpcObj->getWorldPos(), pHuman->getWorldPos()); if(fDist>MAX_NPC_DISTANCE) { g_pLog->FastSaveLog( LOG_FILE_1, "CGShopBuyHandler Out Of Range") ; return PACKET_EXE_CONTINUE ; } if(pHuman->Shop( ) == NULL) {//没有打开交易窗口就买 Assert(0); return PACKET_EXE_CONTINUE ; } //打开商店时,这个商店的指针已经被存在human身上了,关闭商店时它会被清空 _SHOP* pShop = pHuman->Shop( ) ; INT itemNumber = 0; //暂时规定200以上为回购的商品栏 if(m_nndex >= 200) {//在回购队列中查找 m_nndex -= 200; _ITEM tempItem; UINT uPrice = 0; if(!pHuman->GetFromSoldListByIndex(m_nndex, tempItem, uPrice)) { //Assert(0); return PACKET_EXE_CONTINUE ; } itemNumber = tempItem.GetItemCount(); INT iPrice = (INT)uPrice; if( ((INT)pHuman->GetMoney()) < iPrice ) {//金钱不够 GCShopBuy Msg ; Msg.SetBuyOk((BYTE)GCShopBuy::BUY_MONEY_FAIL); pHuman->GetPlayer()->SendPacket( &Msg ) ; return PACKET_EXE_CONTINUE ; } if(!pHuman->RecieveOneFromSoldList(m_nndex)) { GCShopBuy Msg ; Msg.SetBuyOk((BYTE)GCShopBuy::BUY_BAG_FULL); pHuman->GetPlayer()->SendPacket( &Msg ) ; return PACKET_EXE_CONTINUE ; } else {//从回购列表里面购买成功 pHuman->SetMoney( pHuman->GetMoney() - iPrice); MONEY_LOG_PARAM MoneyLogParam; MoneyLogParam.CharGUID = pHuman->GetGUID(); MoneyLogParam.OPType = MONEY_SHOP_COST; MoneyLogParam.Count = iPrice; MoneyLogParam.SceneID = pHuman->getScene()->SceneID(); MoneyLogParam.XPos = pHuman->getWorldPos()->m_fX; MoneyLogParam.ZPos = pHuman->getWorldPos()->m_fZ; SaveMoneyLog(&MoneyLogParam); GCShopBuy Msg ; Msg.SetBuyOk( (BYTE)GCShopBuy::BUY_OK ); Msg.SetIndex( tempItem.m_ItemIndex ); Msg.SetNum( tempItem.GetItemCount() ); pHuman->GetPlayer()->SendPacket( &Msg ) ; //更新回购按钮 //刷新整个回购列表商品到界面 GCShopSoldList::_MERCHANDISE_ITEM SoldItem[MAX_BOOTH_SOLD_NUMBER]; // 20100413 AddCodeBegin pHuman->ReorderSoldList(); // 重新整理回购物品列表,去除中间的空物品格 // 20100413 AddCodeBegin pHuman->GetSlodListInfo(&SoldItem[0]); GCShopSoldList MsgSold; MsgSold.SetMerchadiseNum(MAX_BOOTH_SOLD_NUMBER); MsgSold.SetMerchadiseList(&SoldItem[0]); pHuman->GetPlayer()->SendPacket( &MsgSold ); } } else {//在商人挂的商店里查找 //一次点击可以买的个数 0为约定值,为默认购买数量以商店配置文件为准 INT itemNumber; if (pPacket->GetCount() == 0) { itemNumber = 1; } else { itemNumber = pPacket->GetCount(); } if( pShop->m_IsDyShop ) { //校验商店版本,不匹配提示客户端刷新贩卖列表 if (pShop->m_nVersion != pPacket->GetVersion()) { GCShopBuy Msg ; Msg.SetBuyOk((BYTE)GCShopBuy::BUY_MUST_FRESH); pPlayer->SendPacket( &Msg ) ; //填充消息 GCShopUpdateMerchandiseList::_MERCHANDISE_ITEM MerchandiseList[MAX_BOOTH_NUMBER]; INT k = 0; for(INT i = 0;i<pShop->m_ItemList->m_ListCount;i++) { MerchandiseList[k].idTable = pShop->m_ItemList->m_ListTypeIndex[i]; MerchandiseList[k].MaxNumber = pShop->m_ItemList->m_TypeMaxNum[i]; MerchandiseList[k].nPrice = pShop->m_ItemList->m_Price[i]; MerchandiseList[k].nPriceType = pShop->m_ItemList->m_PriceType[i]; MerchandiseList[k++].byNumber = pShop->m_ItemList->m_TypeMaxNum[i]; } GCShopUpdateMerchandiseList listMsg; listMsg.SetMerchadiseNum(k);//一定要先设置数量再设置List listMsg.SetMerchadiseList(MerchandiseList); listMsg.SetVersion(pShop->m_nVersion); pHuman->GetPlayer()->SendPacket( &listMsg ) ; return PACKET_EXE_CONTINUE ; } //有限商品不够卖了 if(pShop->m_ItemList->m_TypeMaxNum[m_nndex] < itemNumber) {//卖完了,直接返回, //应该不会走到这里, //首先表里不应该出现0, //其次卖完的时候服务器会通知所有连在他之上的客户端 //在界面上删掉这个商品,这样玩家也不可能再点这个商品了 GCShopBuy Msg ; Msg.SetBuyOk((BYTE)GCShopBuy::BUY_NO_MERCH); pPlayer->SendPacket( &Msg ) ; return PACKET_EXE_CONTINUE ; } } uint BaseMoney= 0; //静态商店,只扣游戏币 if (!pShop->m_IsDyShop) { //计算价格 BaseMoney = ShopMgr::ConvertItemType2Money(pShop->m_ItemList->m_ListType[m_nndex]); if(BaseMoney<0) BaseMoney = 0; BaseMoney *= static_cast<INT>(pShop->m_scale); BaseMoney *= itemNumber; if( pHuman->GetMoney() < BaseMoney ) {//金钱不够 GCShopBuy Msg ; Msg.SetBuyOk((BYTE)GCShopBuy::BUY_MONEY_FAIL); pHuman->GetPlayer()->SendPacket( &Msg ) ; return PACKET_EXE_CONTINUE ; } } else//动态商店 { INT nPriceType = pShop->m_ItemList->m_PriceType[m_nndex]; INT nPrice = pShop->m_ItemList->m_Price[m_nndex]; switch (nPriceType) { case PRICE_GOLD: { INT nGold = pHuman->GetMoney(); nGold -= nPrice*itemNumber; if (nGold < 0)//这里只管防止发生错误,为什么就不管了 { nGold = 0; GCShopBuy Msg ; Msg.SetBuyOk((BYTE)GCShopBuy::BUY_MONEY_FAIL); pHuman->GetPlayer()->SendPacket( &Msg ) ; return PACKET_EXE_CONTINUE ; } pHuman->SetMoney(nGold); } break; case PRICE_RMB: break; case PRICE_GP://帮贡 { INT nTotal = pHuman->GetHonor() - nPrice*itemNumber; if (nTotal < 0) { nTotal = 0; GCShopBuy Msg ; Msg.SetBuyOk((BYTE)GCShopBuy::BUY_MONEY_FAIL); pHuman->GetPlayer()->SendPacket( &Msg ) ; return PACKET_EXE_CONTINUE ; } pHuman->SetHonor(nTotal); } break; } } ITEM_LOG_PARAM ItemLogParam; ItemLogParam.OpType = ITEM_CREATE_FROM_SHOP; ItemLogParam.CharGUID = pHuman->GetGUID(); ItemLogParam.SceneID = pHuman->getScene()->SceneID(); ItemLogParam.XPos = pHuman->getWorldPos()->m_fX; ItemLogParam.ZPos = pHuman->getWorldPos()->m_fZ; ItemLogParam.ShopGUID = pShop->m_ShopId; if(!HumanItemLogic::CreateMultiItemToBag(&ItemLogParam, pHuman, pShop->m_ItemList->m_ListTypeIndex[m_nndex], itemNumber)) { GCShopBuy Msg ; Msg.SetBuyOk((BYTE)GCShopBuy::BUY_BAG_FULL); pHuman->GetPlayer()->SendPacket( &Msg ) ; return PACKET_EXE_CONTINUE ; } else { SaveItemLog(&ItemLogParam); if (!pShop->m_IsDyShop) { pHuman->SetMoney( pHuman->GetMoney() - BaseMoney); MONEY_LOG_PARAM MoneyLogParam; MoneyLogParam.CharGUID = pHuman->GetGUID(); MoneyLogParam.OPType = MONEY_SHOP_COST; MoneyLogParam.Count = BaseMoney; MoneyLogParam.SceneID = pHuman->getScene()->SceneID(); MoneyLogParam.XPos = pHuman->getWorldPos()->m_fX; MoneyLogParam.ZPos = pHuman->getWorldPos()->m_fZ; SaveMoneyLog(&MoneyLogParam); } GCShopBuy Msg ; Msg.SetBuyOk((BYTE)GCShopBuy::BUY_OK); Msg.SetIndex(pShop->m_ItemList->m_ListTypeIndex[m_nndex]); Msg.SetNum(itemNumber); pHuman->GetPlayer()->SendPacket( &Msg ) ; //要更新此商人的动态商品表 if(pShop->m_IsDyShop) { // 扣除有限物品 pShop->m_ItemList->m_TypeMaxNum[m_nndex] -= itemNumber; //填充消息 GCShopUpdateMerchandiseList::_MERCHANDISE_ITEM MerchandiseList[MAX_BOOTH_NUMBER]; INT k = 0; for(INT i = 0;i<pShop->m_ItemList->m_ListCount;i++) { MerchandiseList[k].idTable = pShop->m_ItemList->m_ListTypeIndex[i]; MerchandiseList[k].MaxNumber = pShop->m_ItemList->m_TypeMaxNum[i]; MerchandiseList[k].nPrice = pShop->m_ItemList->m_Price[i]; MerchandiseList[k].nPriceType = pShop->m_ItemList->m_PriceType[i]; MerchandiseList[k++].byNumber = pShop->m_ItemList->m_TypeMaxNum[i]; } GCShopUpdateMerchandiseList Msg; Msg.SetMerchadiseNum(k);//一定要先设置数量再设置List Msg.SetMerchadiseList(MerchandiseList); Msg.SetVersion(pShop->m_nVersion); pHuman->GetPlayer()->SendPacket( &Msg ) ; } return PACKET_EXE_CONTINUE ; } } g_pLog->FastSaveLog( LOG_FILE_1, "CGShopBuyHandler m_nndex=%d", m_nndex) ; return PACKET_EXE_CONTINUE; __LEAVE_FUNCTION return PACKET_EXE_ERROR ; }
uint CGExchangeOkIIIHandler::Execute( CGExchangeOkIII* pPacket, Player* pPlayer ) { __ENTER_FUNCTION GamePlayer* pGamePlayer = (GamePlayer*)pPlayer ; Assert( pGamePlayer ) ; Obj_Human* pHuman = pGamePlayer->GetHuman() ; Assert( pHuman ) ; Scene* pScene = pHuman->getScene() ; if( pScene==NULL ) { Assert(FALSE) ; return PACKET_EXE_ERROR ; } //检查线程执行资源是否正确 Assert( MyGetCurrentThreadID()==pScene->m_ThreadID ) ; EXCHANGE_CERTIFY_EACH_OTHER(pHuman) ObjID_t DestID = pHuman->m_ExchangBox.m_ObjID; Obj_Character *pTarget = (Obj_Character*)(pScene->GetObjManager()->GetObj( DestID )); if(pTarget->GetObjType() != Obj::OBJ_TYPE_HUMAN) { g_pLog->FastSaveLog( LOG_FILE_1, "CGExchangeOkIIIHandler: %s ask not a human.", pHuman->GetName() ) ; return PACKET_EXE_CONTINUE; } Obj_Human* pDestHuman = (Obj_Human*)pTarget; if( pDestHuman == NULL ) { Assert(FALSE); return PACKET_EXE_CONTINUE; } // 不同阵营,不让查看 if( pHuman->IsEnemy( pDestHuman ) ) { g_pLog->FastSaveLog( LOG_FILE_1, "CGExchangeOkIIIHandler: %s cann't ask %s's detailattr ", pHuman->GetName(), pDestHuman->GetName() ) ; return PACKET_EXE_CONTINUE; } if(pHuman->m_ExchangBox.m_Status == ServerExchangeBox::EXCHANGE_WAIT_FOR_CONFIRM) { //设置可以交换 pHuman->m_ExchangBox.m_Status = ServerExchangeBox::EXCHANGE_CONFIRM_READY; if(pDestHuman->m_ExchangBox.m_Status == ServerExchangeBox::EXCHANGE_CONFIRM_READY) {//可以交换了 //1.变量初始化 ItemContainer* pMyExchangeContainer = &(pHuman->m_ExchangBox.m_Container); ItemContainer* pOtExchangeContainer = &(pDestHuman->m_ExchangBox.m_Container); ItemContainer* pMyExchangePetContainer = &(pHuman->m_ExchangBox.m_PetContainer); ItemContainer* pOtExchangePetContainer = &(pDestHuman->m_ExchangBox.m_PetContainer); _EXCHANGE_ITEM_LIST ItemListMeToOt; _EXCHANGE_ITEM_LIST ItemListOtToMe; ItemListMeToOt.Init(); ItemListOtToMe.Init(); //2.验证循环 g_pLog->FastSaveLog( LOG_FILE_1, "<交易> [%s] 与 [%s] 开始验证循环", pHuman->GetName(), pDestHuman->GetName()) ; for(INT i = 0; i<EXCHANGE_BOX_SIZE; i++) { if(pMyExchangeContainer->GetItem(i)->IsEmpty() == FALSE) { ItemListMeToOt.AddItem( pMyExchangeContainer->GetItem(i) ); } if(pOtExchangeContainer->GetItem(i)->IsEmpty() == FALSE) { ItemListOtToMe.AddItem( pOtExchangeContainer->GetItem(i) ); } } for(INT i = 0; i<EXCHANGE_PET_BOX_SIZE; i++) { if(pMyExchangePetContainer->GetItem(i)->IsEmpty() == FALSE) { ItemListMeToOt.AddItem( pMyExchangePetContainer->GetItem(i) ); } if(pOtExchangePetContainer->GetItem(i)->IsEmpty() == FALSE) { ItemListOtToMe.AddItem( pOtExchangePetContainer->GetItem(i) ); } } if( FALSE == HumanItemLogic::CanReceiveExchangeItemList( pHuman, ItemListOtToMe) ) {//空间不够 GCExchangeError MsgSelf; MsgSelf.SetID(EXCHANGE_MSG::ERR_NOT_ENOUGHT_ROOM_SELF); pHuman->GetPlayer()->SendPacket(&MsgSelf); GCExchangeError MsgOther; MsgOther.SetID(EXCHANGE_MSG::ERR_NOT_ENOUGHT_ROOM_OTHER); pDestHuman->GetPlayer()->SendPacket(&MsgOther); pHuman->m_ExchangBox.CleanUp(); pDestHuman->m_ExchangBox.CleanUp(); g_pLog->FastSaveLog( LOG_FILE_1, " <交易> [%s] 空间不够", pHuman->GetName()) ; return PACKET_EXE_CONTINUE; } if( FALSE == HumanItemLogic::CanReceiveExchangeItemList( pDestHuman, ItemListMeToOt) ) {//空间不够 GCExchangeError MsgSelf; MsgSelf.SetID(EXCHANGE_MSG::ERR_NOT_ENOUGHT_ROOM_SELF); pDestHuman->GetPlayer()->SendPacket(&MsgSelf); GCExchangeError MsgOther; MsgOther.SetID(EXCHANGE_MSG::ERR_NOT_ENOUGHT_ROOM_OTHER); pHuman->GetPlayer()->SendPacket(&MsgOther); pHuman->m_ExchangBox.CleanUp(); pDestHuman->m_ExchangBox.CleanUp(); g_pLog->FastSaveLog( LOG_FILE_1, " <交易> [%s] 空间不够", pDestHuman->GetName()) ; return PACKET_EXE_CONTINUE; } if( pHuman->m_ExchangBox.m_Money > pHuman->GetMoney() ) {//金钱非法 GCExchangeError MsgSelf; MsgSelf.SetID(EXCHANGE_MSG::ERR_NOT_ENOUGHT_MONEY_SELF); pHuman->GetPlayer()->SendPacket(&MsgSelf); GCExchangeError MsgOther; MsgOther.SetID(EXCHANGE_MSG::ERR_NOT_ENOUGHT_MONEY_OTHER); pDestHuman->GetPlayer()->SendPacket(&MsgOther); pHuman->m_ExchangBox.CleanUp(); pDestHuman->m_ExchangBox.CleanUp(); g_pLog->FastSaveLog( LOG_FILE_1, " <交易> [%s] 金钱不足", pHuman->GetName()) ; return PACKET_EXE_CONTINUE; } if( pDestHuman->m_ExchangBox.m_Money > pDestHuman->GetMoney() ) {//金钱非法 GCExchangeError MsgSelf; MsgSelf.SetID(EXCHANGE_MSG::ERR_NOT_ENOUGHT_MONEY_SELF); pDestHuman->GetPlayer()->SendPacket(&MsgSelf); GCExchangeError MsgOther; MsgOther.SetID(EXCHANGE_MSG::ERR_NOT_ENOUGHT_MONEY_OTHER); pHuman->GetPlayer()->SendPacket(&MsgOther); pHuman->m_ExchangBox.CleanUp(); pDestHuman->m_ExchangBox.CleanUp(); g_pLog->FastSaveLog( LOG_FILE_1, " <交易> [%s] 金钱不足", pDestHuman->GetName()) ; return PACKET_EXE_CONTINUE; } //2.1宠物验证 Obj_Pet* pDestPet = pDestHuman->GetPet(); Obj_Pet* pMyPet = pHuman->GetPet(); PET_GUID_t DestPetGuid; PET_GUID_t MyPetGuid; if(pDestPet) { DestPetGuid = pDestPet->GetPetGUID(); } if(pMyPet) { MyPetGuid = pMyPet->GetPetGUID(); } //如果是当前召唤出来的宠物,先收回来再换 for(INT i = 0; i<EXCHANGE_PET_BOX_SIZE; i++) { if(pMyExchangePetContainer->GetItem(i)->IsEmpty() == FALSE) { INT nPetLevel = pMyExchangePetContainer->GetItem(i)->GetLevel(); INT nHumanLevel = pDestHuman->GetLevel(); PET_GUID_t ExchPetGuid = pMyExchangePetContainer->GetItem(i)->GetPetGUID(); if(nPetLevel>nHumanLevel) { GCExchangeError Msg; Msg.SetID(EXCHANGE_MSG::ERR_PET_LEVEL_TOO_HIGH); pHuman->GetPlayer()->SendPacket(&Msg); pDestHuman->GetPlayer()->SendPacket(&Msg); pHuman->m_ExchangBox.CleanUp(); pDestHuman->m_ExchangBox.CleanUp(); g_pLog->FastSaveLog( LOG_FILE_1, " <交易> 宠物级别过高 petlevel = %d, humanlevel = %d", nPetLevel, nHumanLevel) ; return PACKET_EXE_CONTINUE; } if(ExchPetGuid == MyPetGuid) { pHuman->ReCallPet(); } } if(pOtExchangePetContainer->GetItem(i)->IsEmpty() == FALSE) { INT nPetLevel = pOtExchangePetContainer->GetItem(i)->GetLevel(); INT nHumanLevel = pHuman->GetLevel(); PET_GUID_t ExchPetGuid = pOtExchangePetContainer->GetItem(i)->GetPetGUID(); if(nPetLevel>nHumanLevel) { GCExchangeError Msg; Msg.SetID(EXCHANGE_MSG::ERR_PET_LEVEL_TOO_HIGH); pHuman->GetPlayer()->SendPacket(&Msg); pDestHuman->GetPlayer()->SendPacket(&Msg); pHuman->m_ExchangBox.CleanUp(); pDestHuman->m_ExchangBox.CleanUp(); g_pLog->FastSaveLog( LOG_FILE_1, " <交易> 宠物级别过高 petlevel = %d, humanlevel = %d", nPetLevel, nHumanLevel) ; return PACKET_EXE_CONTINUE; } if(ExchPetGuid == DestPetGuid) { pDestHuman->ReCallPet(); } } } //3.移动物品循环 g_pLog->FastSaveLog( LOG_FILE_1, "<交易> [%s] 与 [%s] 开始移动循环", pHuman->GetName(), pDestHuman->GetName()) ; GCExchangeSuccessIII MsgSuccessToMe, MsgSuccessToOt; GCExchangeSuccessIII::_SUCC_ITEM ItemListToMe[EXCHANGE_BOX_SIZE+EXCHANGE_PET_BOX_SIZE]; INT MyItemNum = 0; GCExchangeSuccessIII::_SUCC_ITEM ItemListToOt[EXCHANGE_BOX_SIZE+EXCHANGE_PET_BOX_SIZE]; INT OtItemNum = 0; BOOL bFlag = FALSE; //用来记录可以交换的物品 struct ExItem_t { UCHAR uItemType; INT nIndex; INT nIndexInEx; ExItem_t() { uItemType = 0; nIndex = -1; nIndexInEx = -1; } }; INT ExItemNumOt = 0; ExItem_t ExItemIndexInOt[EXCHANGE_BOX_SIZE]; INT ExItemNumMy = 0; ExItem_t ExItemIndexInMy[EXCHANGE_BOX_SIZE]; INT ExPetItemNumOt = 0; ExItem_t ExPetItemIndexInOt[EXCHANGE_PET_BOX_SIZE]; INT ExPetItemNumMy = 0; ExItem_t ExPetItemIndexInMy[EXCHANGE_PET_BOX_SIZE]; for(INT i = 0; i<EXCHANGE_BOX_SIZE; i++) { if(pMyExchangeContainer->GetItem(i)->IsEmpty() == FALSE) { Item* pItemRef = pMyExchangeContainer->GetItem(i); ItemContainer* pMyBagContainer = HumanItemLogic::GetItemContain(pHuman, pItemRef->GetItemTableIndex()); ExItemIndexInMy[ExItemNumMy].uItemType = pItemRef->GetItemClass(); ExItemIndexInMy[ExItemNumMy].nIndex = pMyBagContainer->GetIndexByGUID(&pItemRef->GetGUID()); ExItemIndexInMy[ExItemNumMy].nIndexInEx = i; ExItemNumMy++; } if(pOtExchangeContainer->GetItem(i)->IsEmpty() == FALSE) { Item* pItemRef = pOtExchangeContainer->GetItem(i); ItemContainer* pOtBagContainer = HumanItemLogic::GetItemContain(pDestHuman, pItemRef->GetItemTableIndex()); ExItemIndexInOt[ExItemNumOt].uItemType = pItemRef->GetItemClass(); ExItemIndexInOt[ExItemNumOt].nIndex = pOtBagContainer->GetIndexByGUID(&pItemRef->GetGUID()); ExItemIndexInOt[ExItemNumOt].nIndexInEx = i; ExItemNumOt++; } } for(INT i = 0; i<EXCHANGE_PET_BOX_SIZE; i++) { if(pMyExchangePetContainer->GetItem(i)->IsEmpty() == FALSE) { Item* pItemRef = pMyExchangePetContainer->GetItem(i); ItemContainer* pMyPetContainer = pHuman->GetPetContain(); ExPetItemIndexInMy[ExPetItemNumMy].nIndex = pMyPetContainer->GetIndexByGUID(&pItemRef->GetPetGUID()); ExPetItemIndexInMy[ExPetItemNumMy].nIndexInEx = i; ExPetItemNumMy++; } if(pOtExchangePetContainer->GetItem(i)->IsEmpty() == FALSE) { Item* pItemRef = pOtExchangePetContainer->GetItem(i); ItemContainer* pOtPetContainer = pDestHuman->GetPetContain(); ExPetItemIndexInOt[ExPetItemNumOt].nIndex = pOtPetContainer->GetIndexByGUID(&pItemRef->GetPetGUID()); ExPetItemIndexInOt[ExPetItemNumOt].nIndexInEx = i; ExPetItemNumOt++; } } //3.1先把能交换的交换掉,如果在对方的包中找到了正在跟自己交易的物品,直接交换这两个物品的位置 for(INT i = 0; i<EXCHANGE_BOX_SIZE; i++) { if(pMyExchangeContainer->GetItem(i)->IsEmpty() == FALSE) { INT result = 0; Item* pItemRef = pMyExchangeContainer->GetItem(i); //自己的容器 ItemContainer* pMyBagContainer = HumanItemLogic::GetItemContain(pHuman, pItemRef->GetItemTableIndex()); INT BagIndex = pMyBagContainer->GetIndexByGUID(&pItemRef->GetGUID()); //对方的容器 ItemContainer* pOtBagContainer = HumanItemLogic::GetItemContain(pDestHuman, pItemRef->GetItemTableIndex()); //去换能换得 for(INT j = 0; j<ExItemNumOt; j++) { //此位置已经无效 if(ExItemIndexInOt[j].nIndex == -1) continue; //只有同一类型的物品才能够交换 if(pItemRef->GetItemClass()!=ExItemIndexInOt[j].uItemType) continue; //解锁自己 g_ItemOperator.UnlockItem( pMyBagContainer, BagIndex ); //先解锁对方 g_ItemOperator.UnlockItem( pOtBagContainer, ExItemIndexInOt[j].nIndex ); //设置自己物品已经不是交易物品了 pMyBagContainer->GetItem(BagIndex)->SetInExchange(FALSE); //设置对方物品已经不是交易物品了 pOtBagContainer->GetItem(ExItemIndexInOt[j].nIndex)->SetInExchange(FALSE); //与一个对方欲交易的物品交换 result = g_ItemOperator.ExchangeItem ( pMyBagContainer, BagIndex, pOtBagContainer, ExItemIndexInOt[j].nIndex ); if(result<0) {//拷贝失败 GCExchangeError Msg; Msg.SetID(EXCHANGE_MSG::ERR_ILLEGAL); pHuman->GetPlayer()->SendPacket(&Msg); pDestHuman->GetPlayer()->SendPacket(&Msg); pHuman->m_ExchangBox.CleanUp(); pDestHuman->m_ExchangBox.CleanUp(); g_pLog->FastSaveLog( LOG_FILE_1, " <交易> [%s] <-> [%s] 物品 [%d]失败 result = %d", pHuman->GetName(), pDestHuman->GetName(), pItemRef->GetItemTableIndex(), result ); return PACKET_EXE_CONTINUE; } else { ITEM_LOG_PARAM ItemLogParam; ItemLogParam.OpType = ITEM_EXCHANGE_TOOTHER; ItemLogParam.CharGUID = pHuman->GetGUID(); ItemLogParam.TargetGUID = pDestHuman->GetGUID(); ItemLogParam.XPos = pHuman->getWorldPos()->m_fX; ItemLogParam.ZPos = pHuman->getWorldPos()->m_fZ; ItemLogParam.SceneID = pHuman->getScene()->SceneID(); ItemLogParam.ItemGuid = pItemRef->GetGUID(); ItemLogParam.ItemType = pItemRef->GetItemTableIndex(); ItemListToOt[OtItemNum].m_FromType = 0; ItemListToOt[OtItemNum].m_FromIndex = i; ItemListToOt[OtItemNum].m_ToType = EXCHANGE_MSG::POS_BAG; ItemListToOt[OtItemNum++].m_ToIndex = pOtBagContainer->ConIndex2BagIndex(ExItemIndexInOt[j].nIndex); ItemListToMe[MyItemNum].m_FromType = 0; ItemListToMe[MyItemNum].m_FromIndex = ExItemIndexInOt[j].nIndexInEx; ItemListToMe[MyItemNum].m_ToType = EXCHANGE_MSG::POS_BAG; ItemListToMe[MyItemNum++].m_ToIndex = pMyBagContainer->ConIndex2BagIndex(BagIndex); //从交易盒中删掉此物品,在后面的移动中就不用再移动它了 g_ItemOperator.EraseItem(pMyExchangeContainer, i); g_ItemOperator.EraseItem(pOtExchangeContainer, ExItemIndexInOt[j].nIndexInEx); ExItemIndexInOt[j].nIndex = -1; g_pLog->FastSaveLog( LOG_FILE_1, " <交易> [%s] <-> [%s] 物品 [%d]成功", pHuman->GetName(), pDestHuman->GetName(), pItemRef->GetItemTableIndex() ); break; } } } } //3.2不能交换的一个一个放进去,剩下的直接由系统找格放入 for(INT i = 0; i<EXCHANGE_BOX_SIZE; i++) { if(pMyExchangeContainer->GetItem(i)->IsEmpty() == FALSE) { INT result = 0; Item* pItemRef = pMyExchangeContainer->GetItem(i); //自己的容器 ItemContainer* pMyBagContainer = HumanItemLogic::GetItemContain(pHuman, pItemRef->GetItemTableIndex()); INT BagIndex = pMyBagContainer->GetIndexByGUID(&pItemRef->GetGUID()); //对方的容器 ItemContainer* pOtBagContainer = HumanItemLogic::GetItemContain(pDestHuman, pItemRef->GetItemTableIndex()); //先解锁 g_ItemOperator.UnlockItem( pMyBagContainer, BagIndex ); pMyBagContainer->GetItem(BagIndex)->SetInExchange(FALSE); //自动找格,支持自动叠加 //这里的自动找格改成可以自动叠加,这里会有一个问题,上面收取检测时是不考虑叠加状态的,所以,如果非叠加状态下的 //可以收取一系列物品,可叠加的一定可以接受。检测的范围会大一点。 result = g_ItemOperator.MoveItem ( pMyBagContainer, BagIndex, bFlag, pOtBagContainer ); if(result<0) {//拷贝失败 GCExchangeError Msg; Msg.SetID(EXCHANGE_MSG::ERR_ILLEGAL); pHuman->GetPlayer()->SendPacket(&Msg); pDestHuman->GetPlayer()->SendPacket(&Msg); pHuman->m_ExchangBox.CleanUp(); pDestHuman->m_ExchangBox.CleanUp(); g_pLog->FastSaveLog( LOG_FILE_1, " <交易> [%s] -> [%s] 物品 [%d]失败 result = %d", pHuman->GetName(), pDestHuman->GetName(), pItemRef->GetItemTableIndex(), result ); return PACKET_EXE_CONTINUE; } else { ITEM_LOG_PARAM ItemLogParam; ItemLogParam.OpType = ITEM_EXCHANGE_TOOTHER; ItemLogParam.CharGUID = pHuman->GetGUID(); ItemLogParam.TargetGUID = pDestHuman->GetGUID(); ItemLogParam.XPos = pHuman->getWorldPos()->m_fX; ItemLogParam.ZPos = pHuman->getWorldPos()->m_fZ; ItemLogParam.SceneID = pHuman->getScene()->SceneID(); ItemLogParam.ItemGuid = pItemRef->GetGUID(); ItemLogParam.ItemType = pItemRef->GetItemTableIndex(); ItemListToOt[OtItemNum].m_FromType = 0; ItemListToOt[OtItemNum].m_FromIndex = i; ItemListToOt[OtItemNum].m_ToType = EXCHANGE_MSG::POS_BAG; ItemListToOt[OtItemNum++].m_ToIndex = pOtBagContainer->ConIndex2BagIndex(result); g_pLog->FastSaveLog( LOG_FILE_1, " <交易> [%s] -> [%s] 物品 [%d]成功", pHuman->GetName(), pDestHuman->GetName(), pItemRef->GetItemTableIndex() ); } } if(pOtExchangeContainer->GetItem(i)->IsEmpty() == FALSE) { INT result = 0; Item* pItemRef = pOtExchangeContainer->GetItem(i); //对方的容器 ItemContainer* pOtBagContainer = HumanItemLogic::GetItemContain(pDestHuman, pItemRef->GetItemTableIndex()); INT BagIndex = pOtBagContainer->GetIndexByGUID(&pItemRef->GetGUID()); //自己的容器 ItemContainer* pMyBagContainer = HumanItemLogic::GetItemContain(pHuman, pItemRef->GetItemTableIndex()); //先解锁 g_ItemOperator.UnlockItem( pOtBagContainer, BagIndex ); pOtBagContainer->GetItem(BagIndex)->SetInExchange(FALSE); //自动找格,支持自动叠加 result = g_ItemOperator.MoveItem ( pOtBagContainer, BagIndex, bFlag, pMyBagContainer ); if(result<0) {//拷贝失败 GCExchangeError Msg; Msg.SetID(EXCHANGE_MSG::ERR_ILLEGAL); pHuman->GetPlayer()->SendPacket(&Msg); pDestHuman->GetPlayer()->SendPacket(&Msg); pHuman->m_ExchangBox.CleanUp(); pDestHuman->m_ExchangBox.CleanUp(); g_pLog->FastSaveLog( LOG_FILE_1, " <交易> [%s] -> [%s] 物品 [%d]失败 result = %d", pDestHuman->GetName(), pHuman->GetName(), pItemRef->GetItemTableIndex(), result ); return PACKET_EXE_CONTINUE; } else { ITEM_LOG_PARAM ItemLogParam; ItemLogParam.OpType = ITEM_EXCHANGE_TOOTHER; ItemLogParam.CharGUID = pDestHuman->GetGUID(); ItemLogParam.TargetGUID = pHuman->GetGUID(); ItemLogParam.XPos = pDestHuman->getWorldPos()->m_fX; ItemLogParam.ZPos = pDestHuman->getWorldPos()->m_fZ; ItemLogParam.SceneID = pDestHuman->getScene()->SceneID(); ItemLogParam.ItemGuid = pItemRef->GetGUID(); ItemLogParam.ItemType = pItemRef->GetItemTableIndex(); SaveItemLog(&ItemLogParam); ItemListToMe[MyItemNum].m_FromType = 0; ItemListToMe[MyItemNum].m_FromIndex = i; ItemListToMe[MyItemNum].m_ToType = EXCHANGE_MSG::POS_BAG; ItemListToMe[MyItemNum++].m_ToIndex = pMyBagContainer->ConIndex2BagIndex(result); g_pLog->FastSaveLog( LOG_FILE_1, " <交易> [%s] -> [%s] 物品 [%d]成功", pDestHuman->GetName(), pHuman->GetName(), pItemRef->GetItemTableIndex() ); } } } //3.3换宠物 g_pLog->FastSaveLog( LOG_FILE_1, "<交易> [%s] 与 [%s] 开始交换宠物", pHuman->GetName(), pDestHuman->GetName()) ; for(INT i = 0; i<EXCHANGE_PET_BOX_SIZE; i++) { INT result = 0; Item* pItemRef = pMyExchangePetContainer->GetItem(i); if(pItemRef->IsEmpty()) continue; PET_LOG_PARAM PetLogParam; PetLogParam.PetGUID = pItemRef->GetPetGUID(); PetLogParam.DataID = pItemRef->GetDataID(); //自己的容器 ItemContainer* pMyPetContainer = pHuman->GetPetContain(); INT PetIndexInBag = pMyPetContainer->GetIndexByGUID(&pItemRef->GetPetGUID()); //对方的容器 ItemContainer* pOtPetContainer = pDestHuman->GetPetContain(); //去换能换得 for(INT j = 0; j<ExPetItemNumOt; j++) { //如果无效 if(ExPetItemIndexInOt[j].nIndex == -1) continue; //解锁自己 g_ItemOperator.UnlockItem( pMyPetContainer, PetIndexInBag ); //先解锁对方 g_ItemOperator.UnlockItem( pOtPetContainer, ExPetItemIndexInOt[j].nIndex ); //设置自己物品已经不是交易物品了 pMyPetContainer->GetItem(PetIndexInBag)->SetInExchange(FALSE); //设置对方物品已经不是交易物品了 pOtPetContainer->GetItem(ExPetItemIndexInOt[j].nIndex )->SetInExchange(FALSE); //与一个对方欲交易的物品交换 result = g_ItemOperator.ExchangeItem ( pMyPetContainer, PetIndexInBag, pOtPetContainer, ExPetItemIndexInOt[j].nIndex ); if(result<0) {//拷贝失败 GCExchangeError Msg; Msg.SetID(EXCHANGE_MSG::ERR_ILLEGAL); pHuman->GetPlayer()->SendPacket(&Msg); pDestHuman->GetPlayer()->SendPacket(&Msg); pHuman->m_ExchangBox.CleanUp(); pDestHuman->m_ExchangBox.CleanUp(); g_pLog->FastSaveLog( LOG_FILE_1, " <交易> [%s] <-> [%s] 物品 [%d]失败 result = %d", pHuman->GetName(), pDestHuman->GetName(), pItemRef->GetItemTableIndex(), result ); return PACKET_EXE_CONTINUE; } else { PetLogParam.CharGUID = pDestHuman->GetGUID(); PetLogParam.OPType = PET_OP_EXCHANGE_OTHER; PetLogParam.SceneID = pDestHuman->getScene()->SceneID(); PetLogParam.TargetGUID = pHuman->GetGUID(); PetLogParam.XPos = pDestHuman->getWorldPos()->m_fX; PetLogParam.ZPos = pDestHuman->getWorldPos()->m_fZ; SavePetLog(&PetLogParam); ItemListToMe[MyItemNum].m_FromType = EXCHANGE_MSG::POS_PET; ItemListToMe[MyItemNum].m_FromIndex = ExPetItemIndexInOt[j].nIndexInEx; ItemListToMe[MyItemNum].m_ToType = EXCHANGE_MSG::POS_PET; ItemListToMe[MyItemNum++].m_ToIndex = PetIndexInBag; ItemListToOt[OtItemNum].m_FromType = EXCHANGE_MSG::POS_PET; ItemListToOt[OtItemNum].m_FromIndex = i; ItemListToOt[OtItemNum].m_ToType = EXCHANGE_MSG::POS_PET; ItemListToOt[OtItemNum++].m_ToIndex = ExPetItemIndexInOt[j].nIndex; //从交易盒中删掉此物品,在后面的移动中就不用再移动它了 g_ItemOperator.EraseItem(pMyExchangePetContainer, i); g_ItemOperator.EraseItem(pOtExchangePetContainer, ExPetItemIndexInOt[j].nIndexInEx); ExPetItemIndexInOt[j].nIndex = -1; g_pLog->FastSaveLog( LOG_FILE_1, " <交易> [%s] <-> [%s] 物品 [%s]成功", pHuman->GetName(), pDestHuman->GetName(), pItemRef->GetName() ); break; } } } //3.4移宠物 for(INT i = 0; i<EXCHANGE_PET_BOX_SIZE; i++) { if(pMyExchangePetContainer->GetItem(i)->IsEmpty() == FALSE) { INT result = 0; Item* pItemRef = pMyExchangePetContainer->GetItem(i); PET_LOG_PARAM PetLogParam; PetLogParam.PetGUID = pItemRef->GetPetGUID(); PetLogParam.DataID = pItemRef->GetDataID(); //自己的容器 ItemContainer* pMyPetContainer = pHuman->GetPetContain(); INT PetIndexInBag = pMyPetContainer->GetIndexByGUID(&pItemRef->GetPetGUID()); //对方的容器 ItemContainer* pOtPetContainer = pDestHuman->GetPetContain(); //先解锁 g_ItemOperator.UnlockItem( pMyPetContainer, PetIndexInBag ); pMyPetContainer->GetItem(PetIndexInBag)->SetInExchange(FALSE); //自动找格,支持自动叠加 //这里的自动找格改成可以自动叠加,这里会有一个问题,上面收取检测时是不考虑叠加状态的,所以,如果非叠加状态下的 //可以收取一系列物品,可叠加的一定可以接受。检测的范围会大一点。 result = g_ItemOperator.MoveItem ( pMyPetContainer, PetIndexInBag, pOtPetContainer ); if(result<0) {//拷贝失败 GCExchangeError Msg; Msg.SetID(EXCHANGE_MSG::ERR_ILLEGAL); pHuman->GetPlayer()->SendPacket(&Msg); pDestHuman->GetPlayer()->SendPacket(&Msg); pHuman->m_ExchangBox.CleanUp(); pDestHuman->m_ExchangBox.CleanUp(); g_pLog->FastSaveLog( LOG_FILE_1, " <交易> [%s] -> [%s] 宠物 [%s]失败 result = %d", pHuman->GetName(), pDestHuman->GetName(), pItemRef->GetName(), result ); return PACKET_EXE_CONTINUE; } else { PetLogParam.CharGUID = pDestHuman->GetGUID(); PetLogParam.OPType = PET_OP_EXCHANGE_OTHER; PetLogParam.SceneID = pDestHuman->getScene()->SceneID(); PetLogParam.TargetGUID = pHuman->GetGUID(); PetLogParam.XPos = pDestHuman->getWorldPos()->m_fX; PetLogParam.ZPos = pDestHuman->getWorldPos()->m_fZ; SavePetLog(&PetLogParam); ItemListToOt[OtItemNum].m_FromType = EXCHANGE_MSG::POS_PET; ItemListToOt[OtItemNum].m_FromIndex = i; ItemListToOt[OtItemNum].m_ToType = EXCHANGE_MSG::POS_PET; ItemListToOt[OtItemNum++].m_ToIndex = result; g_pLog->FastSaveLog( LOG_FILE_1, " <交易> [%s] -> [%s] 宠物 [%s]成功", pHuman->GetName(), pDestHuman->GetName(), pItemRef->GetName() ); } } if(pOtExchangePetContainer->GetItem(i)->IsEmpty() == FALSE) { INT result = 0; Item* pItemRef = pOtExchangePetContainer->GetItem(i); PET_LOG_PARAM PetLogParam; PetLogParam.PetGUID = pItemRef->GetPetGUID(); PetLogParam.DataID = pItemRef->GetDataID(); //对方的容器 ItemContainer* pOtPetContainer = pDestHuman->GetPetContain(); INT PetIndexInBag = pOtPetContainer->GetIndexByGUID(&pItemRef->GetPetGUID()); //自己的容器 ItemContainer* pMyPetContainer = pHuman->GetPetContain(); //先解锁 g_ItemOperator.UnlockItem( pOtPetContainer, PetIndexInBag ); pOtPetContainer->GetItem(PetIndexInBag)->SetInExchange(FALSE); //自动找格,支持自动叠加 result = g_ItemOperator.MoveItem ( pOtPetContainer, PetIndexInBag, pMyPetContainer ); if(result<0) {//拷贝失败 GCExchangeError Msg; Msg.SetID(EXCHANGE_MSG::ERR_ILLEGAL); pHuman->GetPlayer()->SendPacket(&Msg); pDestHuman->GetPlayer()->SendPacket(&Msg); pHuman->m_ExchangBox.CleanUp(); pDestHuman->m_ExchangBox.CleanUp(); g_pLog->FastSaveLog( LOG_FILE_1, " <交易> [%s] -> [%s] 宠物 [%s]失败 result = %d", pDestHuman->GetName(), pHuman->GetName(), pItemRef->GetName(), result ); return PACKET_EXE_CONTINUE; } else { PetLogParam.CharGUID = pHuman->GetGUID(); PetLogParam.OPType = PET_OP_EXCHANGE_OTHER; PetLogParam.SceneID = pHuman->getScene()->SceneID(); PetLogParam.TargetGUID = pDestHuman->GetGUID(); PetLogParam.XPos = pHuman->getWorldPos()->m_fX; PetLogParam.ZPos = pHuman->getWorldPos()->m_fZ; SavePetLog(&PetLogParam); ItemListToMe[MyItemNum].m_FromType = EXCHANGE_MSG::POS_PET; ItemListToMe[MyItemNum].m_FromIndex = i; ItemListToMe[MyItemNum].m_ToType = EXCHANGE_MSG::POS_PET; ItemListToMe[MyItemNum++].m_ToIndex = result; g_pLog->FastSaveLog( LOG_FILE_1, " <交易> [%s] -> [%s] 宠物 [%s]成功", pDestHuman->GetName(), pHuman->GetName(), pItemRef->GetName() ); } } } //2.换钱 g_pLog->FastSaveLog( LOG_FILE_1, "<交易> [%s] 与 [%s] 开始交换金钱", pHuman->GetName(), pDestHuman->GetName()) ; if( pHuman->m_ExchangBox.m_Money <= pHuman->GetMoney() && pHuman->m_ExchangBox.m_Money>0 ) { pDestHuman->SetMoney(pDestHuman->GetMoney()+pHuman->m_ExchangBox.m_Money); pHuman->SetMoney(pHuman->GetMoney()-pHuman->m_ExchangBox.m_Money); MONEY_LOG_PARAM MoneyLogParam; MoneyLogParam.CharGUID = pHuman->GetGUID(); MoneyLogParam.TargetGUID = pDestHuman->GetGUID(); MoneyLogParam.OPType = MONEY_EXCHANGE_OUTCOME; MoneyLogParam.Count = pHuman->m_ExchangBox.m_Money; MoneyLogParam.SceneID = pHuman->getScene()->SceneID(); MoneyLogParam.XPos = pHuman->getWorldPos()->m_fX; MoneyLogParam.ZPos = pHuman->getWorldPos()->m_fZ; SaveMoneyLog(&MoneyLogParam); MoneyLogParam.CharGUID = pDestHuman->GetGUID(); MoneyLogParam.TargetGUID = pHuman->GetGUID(); MoneyLogParam.OPType = MONEY_EXCHANGE_INCOME; MoneyLogParam.Count = pHuman->m_ExchangBox.m_Money; MoneyLogParam.SceneID = pDestHuman->getScene()->SceneID(); MoneyLogParam.XPos = pDestHuman->getWorldPos()->m_fX; MoneyLogParam.ZPos = pDestHuman->getWorldPos()->m_fZ; SaveMoneyLog(&MoneyLogParam); g_pLog->FastSaveLog( LOG_FILE_1, " <交易> [%s] -> [%s] 金钱 [%d]", pHuman->GetName(), pDestHuman->GetName(), pHuman->m_ExchangBox.m_Money ); } if( pDestHuman->m_ExchangBox.m_Money <= pDestHuman->GetMoney() && pDestHuman->m_ExchangBox.m_Money>0 ) { pHuman->SetMoney(pHuman->GetMoney()+pDestHuman->m_ExchangBox.m_Money); pDestHuman->SetMoney(pDestHuman->GetMoney() - pDestHuman->m_ExchangBox.m_Money); MONEY_LOG_PARAM MoneyLogParam; MoneyLogParam.CharGUID = pHuman->GetGUID(); MoneyLogParam.TargetGUID = pDestHuman->GetGUID(); MoneyLogParam.OPType = MONEY_EXCHANGE_INCOME; MoneyLogParam.Count = pDestHuman->m_ExchangBox.m_Money; MoneyLogParam.SceneID = pHuman->getScene()->SceneID(); MoneyLogParam.XPos = pHuman->getWorldPos()->m_fX; MoneyLogParam.ZPos = pHuman->getWorldPos()->m_fZ; SaveMoneyLog(&MoneyLogParam); MoneyLogParam.CharGUID = pDestHuman->GetGUID(); MoneyLogParam.TargetGUID = pHuman->GetGUID(); MoneyLogParam.OPType = MONEY_EXCHANGE_OUTCOME; MoneyLogParam.Count = pDestHuman->m_ExchangBox.m_Money; MoneyLogParam.SceneID = pDestHuman->getScene()->SceneID(); MoneyLogParam.XPos = pDestHuman->getWorldPos()->m_fX; MoneyLogParam.ZPos = pDestHuman->getWorldPos()->m_fZ; SaveMoneyLog(&MoneyLogParam); g_pLog->FastSaveLog( LOG_FILE_1, " <交易> [%s] -> [%s] 金钱 [%d]", pDestHuman->GetName(), pHuman->GetName(), pDestHuman->m_ExchangBox.m_Money ); } //给双方发送成功消息 MsgSuccessToMe.SetItemNum(MyItemNum); MsgSuccessToMe.SetItemList(ItemListToMe); pHuman->GetPlayer()->SendPacket(&MsgSuccessToMe); MsgSuccessToOt.SetItemNum(OtItemNum); MsgSuccessToOt.SetItemList(ItemListToOt); pDestHuman->GetPlayer()->SendPacket(&MsgSuccessToOt); g_pLog->FastSaveLog( LOG_FILE_1, "<交易> [%s] 与 [%s] 交易成功", pHuman->GetName(), pDestHuman->GetName()) ; //能走到这儿证明所有操作都已完成清空各自的交易盒 pHuman->m_ExchangBox.CleanUp(); pDestHuman->m_ExchangBox.CleanUp(); } else {//啥也不做,等待对方消息 } } else {//一定出错了 GCExchangeError Msg; Msg.SetID(EXCHANGE_MSG::ERR_ILLEGAL); pHuman->GetPlayer()->SendPacket(&Msg); pHuman->m_ExchangBox.CleanUp(); pDestHuman->GetPlayer()->SendPacket(&Msg); pDestHuman->m_ExchangBox.CleanUp(); return PACKET_EXE_CONTINUE; } return PACKET_EXE_CONTINUE ; __LEAVE_FUNCTION return PACKET_EXE_ERROR ; }
uint CGStallEstablishHandler::Execute( CGStallEstablish* pPacket, Player* pPlayer ) { __ENTER_FUNCTION GamePlayer* pGamePlayer = (GamePlayer*)pPlayer ; Assert( pGamePlayer ) ; Obj_Human* pHuman = pGamePlayer->GetHuman() ; Assert( pHuman ) ; Scene* pScene = pHuman->getScene() ; if( pScene==NULL ) { Assert(FALSE) ; return PACKET_EXE_ERROR ; } //检查线程执行资源是否正确 Assert( MyGetCurrentThreadID()==pScene->m_ThreadID ) ; // 通过AI判断当前状态下能否摆摊 AI_Human* pAIHuman = (AI_Human*)(pHuman->GetAIObj()); if (!pAIHuman) { return PACKET_EXE_ERROR; } ORESULT oResult = pAIHuman->PushCommand_Stall(); if (OR_OK != oResult) { pHuman->SendOperateResultMsg(oResult); return PACKET_EXE_ERROR; } //验证是否有资格摆摊 if(pHuman->m_StallBox.GetStallStatus() != ServerStallBox::STALL_READY) { GCStallError Msg; Msg.SetID(STALL_MSG::ERR_ILLEGAL); pHuman->m_StallBox.CleanUp(); pGamePlayer->SendPacket(&Msg); g_pLog->FastSaveLog( LOG_FILE_1, "ERROR: CGStallEstablishHandler::ObjID=%d, ERR_ILLEGAL:!= ServerStallBox::STALL_READY" ,pHuman->GetID()) ; return PACKET_EXE_CONTINUE ; } UINT PosTax = 0; BYTE TradeTax = 0; StallInfoManager* pStallInfoMgr = pScene->GetStallInfoManager(); if(pStallInfoMgr) { UINT PosX = (UINT)pHuman->getWorldPos()->m_fX; UINT PosZ = (UINT)pHuman->getWorldPos()->m_fZ; PosTax = pStallInfoMgr->StallPosPayment(PosX, PosZ); TradeTax = pStallInfoMgr->StallExchangeTax(PosX, PosZ); if(pHuman->GetMoney() < PosTax) { GCStallError Msg; Msg.SetID(STALL_MSG::ERR_NOT_ENOUGH_MONEY_TO_OPEN); pHuman->m_StallBox.CleanUp(); pGamePlayer->SendPacket(&Msg); g_pLog->FastSaveLog( LOG_FILE_1, "ERROR: CGStallEstablishHandler::ObjID=%d, ERR_NOT_ENOUGH_MONEY_TO_OPEN" ,pHuman->GetID()) ; return PACKET_EXE_CONTINUE ; } else { pHuman->SetMoney(pHuman->GetMoney() - PosTax); MONEY_LOG_PARAM MoneyLogParam; MoneyLogParam.CharGUID = pHuman->GetGUID(); MoneyLogParam.OPType = MONEY_EXCHANGE_STALL_TAX; MoneyLogParam.Count = PosTax; MoneyLogParam.SceneID = pHuman->getScene()->SceneID(); MoneyLogParam.XPos = pHuman->getWorldPos()->m_fX; MoneyLogParam.ZPos = pHuman->getWorldPos()->m_fZ; SaveMoneyLog(&MoneyLogParam); } //验证完毕,设置摊位盒 pHuman->m_StallBox.SetStallStatus(ServerStallBox::STALL_OPEN); pHuman->m_StallBox.SetStallIsOpen(TRUE);//这个语句会引起客户端的显示更新 pHuman->m_StallBox.SetPosTax(PosTax); pHuman->m_StallBox.SetTradeTax(TradeTax); //pHuman->m_StallBox.SetFirstPage(0); //占了这格,不准别人再摆摊了 pStallInfoMgr->SetCanStall(PosX, PosZ, FALSE); pHuman->m_StallBox.SetStallPos(PosX, PosZ); //通知自己初始化自己的摊位盒 GCStallEstablish Msg; pGamePlayer->SendPacket(&Msg); g_pLog->FastSaveLog( LOG_FILE_1, "CGStallEstablishHandler::ObjID=%d" ,pHuman->GetID()) ; } else { Assert(0); } return PACKET_EXE_CONTINUE ; __LEAVE_FUNCTION return PACKET_EXE_ERROR ; }
uint CGShopRepairHandler::Execute( CGShopRepair* pPacket, Player* pPlayer ) { __ENTER_FUNCTION GamePlayer* pGamePlayer = (GamePlayer*)pPlayer ; Assert( pGamePlayer ) ; Obj_Human* pHuman = pGamePlayer->GetHuman() ; Assert( pHuman ) ; Scene* pScene = pHuman->getScene() ; if( pScene==NULL ) { Assert(FALSE) ; return PACKET_EXE_ERROR ; } //检查线程执行资源是否正确 Assert( MyGetCurrentThreadID()==pScene->m_ThreadID ) ; BYTE Opt = pPacket->GetOpt(); BOOL RepairAll = pPacket->IsRepairAll(); //修理全部 BYTE BagIndex = pPacket->GetBagIndex(); //包中的位置 UINT UniqueID = pPacket->GetUniqueID(); SceneID_t SceneID = UniqueID>>16; ObjID_t NpcObjID= UniqueID&0x00ff; if(SceneID != pScene->SceneID()) { g_pLog->FastSaveLog( LOG_FILE_1, "CGShopRepairHandler Illegal scene ObjName = %s", pHuman->GetName()) ; return PACKET_EXE_CONTINUE ; } //距离判定 Obj* pNpcObj = (Obj*) (pScene->GetObjManager()->GetObj(NpcObjID)); if(pNpcObj == NULL) { g_pLog->FastSaveLog( LOG_FILE_1, "CGShopRepairHandler Illegal Obj ObjName = %s", pHuman->GetName()) ; return PACKET_EXE_CONTINUE ; } FLOAT fDist = MySqrt(pNpcObj->getWorldPos(), pHuman->getWorldPos()); if(fDist>MAX_NPC_DISTANCE) { g_pLog->FastSaveLog( LOG_FILE_1, "CGShopRepairHandler Out Of Range ObjName = %s", pHuman->GetName()) ; return PACKET_EXE_CONTINUE ; } Item* pCurItem = NULL; INT MoneySpent = 0; INT MoneyLast = 0; INT MoneyHave = pHuman->GetMoney(); INT RepairedIndex = 0; GCShopRepair Msg; GCShopRepair::REPAIRED_ITEM ItemList[MAX_REPAIRED_NUMBER]; _SHOP* pShop = pHuman->Shop( ) ; if(!pShop) { g_pLog->FastSaveLog( LOG_FILE_1, "ERROR:CGShopRepairHandler Npc Shop Lose"); return PACKET_EXE_CONTINUE; } if(Opt == CGShopRepair::FromBag) { if(RepairAll) { INT nBeginPoint = 0; INT nEndPoint = 0; switch( pShop->m_nRepairType ) { case SHOP_All: { nBeginPoint = HEQUIP_WEAPON; nEndPoint = HEQUIP_RIDER; } break; case SHOP_WEAPON: //防具 { nBeginPoint = HEQUIP_WEAPON; nEndPoint = HEQUIP_WEAPON; } break; case SHOP_DEFENCE: //饰物 { nBeginPoint = HEQUIP_CAP; nEndPoint = HEQUIP_BOOT; } break; case SHOP_ADORN: //武器 { nBeginPoint = HEQUIP_SASH; nEndPoint = HEQUIP_RIDER; } break; default: { return PACKET_EXE_CONTINUE; } break; } for(INT i =nBeginPoint; i<=nEndPoint; i++) { pCurItem = HumanItemLogic::GetEquip(pHuman,(HUMAN_EQUIP)i); //pCurItem = pHuman->GetEquip((HUMAN_EQUIP)i); if(!pCurItem->IsEmpty()) {//有东西 //判定是否狗修理等级 if(pCurItem->GetRequireLevel() > pShop->m_nRepairLevel) { continue; } FLOAT fCur = (FLOAT)pCurItem->GetDurPoints(); FLOAT fMax = (FLOAT)pCurItem->GetMaxDurPoint(); FLOAT V = (FLOAT)pCurItem->GetPrice(); if(fCur != fMax) { //if(fCur<fMax/3) // MoneySpent += (INT)(7*V*V*fCur*6/(4*fMax)+V*V); //else if(fCur>=fMax/3&&fCur<fMax*2/3) // MoneySpent += (INT)(V*V*fCur*6/fMax+V*V*3/4); //else if(fCur>=fMax*2/3&&fCur<fMax) // MoneySpent += (INT)(V*V*fCur*6/(4*fMax)+V*V/4); MoneySpent += (INT) ( ((REPAIR_SPEND * (1- fCur/fMax) * V) * pShop->m_nRepairSpend) + 0.5); //临时的修理费计算方法 // FLOAT scale = (FLOAT)(fCur/fMax); // scale = 1-scale; // MoneySpent += static_cast<INT>(pCurItem->GetPrice()*scale); if(MoneyHave<MoneySpent) break; MoneyLast = MoneySpent; HumanItemLogic::SetEquipDur(pHuman,(HUMAN_EQUIP)i, (INT)fMax); ItemList[RepairedIndex].IsIn = GCShopRepair::EQUIP; ItemList[RepairedIndex++].BagIndex = (BYTE)i; } } } if(MoneyHave<MoneySpent) {//break出来的 if(RepairedIndex) { pHuman->SetMoney(MoneyHave - MoneyLast); MONEY_LOG_PARAM MoneyLogParam; MoneyLogParam.CharGUID = pHuman->GetGUID(); MoneyLogParam.OPType = MONEY_SHOP_REPAIR; MoneyLogParam.Count = MoneyLast; MoneyLogParam.SceneID = pHuman->getScene()->SceneID(); MoneyLogParam.XPos = pHuman->getWorldPos()->m_fX; MoneyLogParam.ZPos = pHuman->getWorldPos()->m_fZ; SaveMoneyLog(&MoneyLogParam); Msg.SetAll(0); Msg.SetReListNum(RepairedIndex); Msg.SetReList(ItemList); pHuman->GetPlayer()->SendPacket(&Msg); } GCShopBuy Msg ; Msg.SetBuyOk((BYTE)GCShopBuy::BUY_MONEY_FAIL); pHuman->GetPlayer()->SendPacket( &Msg ) ; g_pLog->FastSaveLog( LOG_FILE_1, "CGShopRepairHandler BUY_MONEY_FAIL") ; return PACKET_EXE_CONTINUE ; } else if(MoneySpent != 0) {//全修完了 pHuman->SetMoney(MoneyHave - MoneySpent); MONEY_LOG_PARAM MoneyLogParam; MoneyLogParam.CharGUID = pHuman->GetGUID(); MoneyLogParam.OPType = MONEY_SHOP_REPAIR; MoneyLogParam.Count = MoneySpent; MoneyLogParam.SceneID = pHuman->getScene()->SceneID(); MoneyLogParam.XPos = pHuman->getWorldPos()->m_fX; MoneyLogParam.ZPos = pHuman->getWorldPos()->m_fZ; SaveMoneyLog(&MoneyLogParam); Msg.SetAll(1); Msg.SetReListNum(0); pHuman->GetPlayer()->SendPacket(&Msg); } } else {//修理单个,一定应该在背包中 pCurItem = HumanItemLogic::GetItem(pHuman,BagIndex); if(!pCurItem->IsEmpty()) { if(pCurItem->GetRequireLevel()>pShop->m_nRepairLevel) { g_pLog->FastSaveLog( LOG_FILE_1, "CGShopRepairHandler Npc have no the Repair Levle") ; return PACKET_EXE_CONTINUE; } BOOL bCanRepair = TRUE; switch( pShop->m_nRepairType ) { case SHOP_All: { } break; case SHOP_DEFENCE: //防具 { if( pCurItem->GetEquipPoint() != HEQUIP_CAP && pCurItem->GetEquipPoint() != HEQUIP_ARMOR && pCurItem->GetEquipPoint() != HEQUIP_CUFF && pCurItem->GetEquipPoint() != HEQUIP_BOOT ) { bCanRepair = FALSE; } } break; case SHOP_ADORN: //饰物 { if( pCurItem->GetEquipPoint() != HEQUIP_SASH && pCurItem->GetEquipPoint() != HEQUIP_RING && pCurItem->GetEquipPoint() != HEQUIP_NECKLACE && pCurItem->GetEquipPoint() != HEQUIP_RIDER) { bCanRepair = FALSE; } } break; case SHOP_WEAPON: //武器 { if( pCurItem->GetEquipPoint() != HEQUIP_WEAPON ) { bCanRepair = FALSE; } } break; default: { bCanRepair = FALSE; } break; } if(bCanRepair == FALSE) { g_pLog->FastSaveLog( LOG_FILE_1, "CGShopRepairHandler Npc have no the Repair type") ; return PACKET_EXE_CONTINUE; } FLOAT fCur = (FLOAT)pCurItem->GetDurPoints(); FLOAT fMax = (FLOAT)pCurItem->GetMaxDurPoint(); FLOAT V = (FLOAT)pCurItem->GetPrice(); if(fCur != fMax) { //if(fCur<fMax/3) // MoneySpent += (INT)(7*V*V*fCur*6/(4*fMax)+V*V); //else if(fCur>=fMax/3&&fCur<fMax*2/3) // MoneySpent += (INT)(V*V*fCur*6/fMax+V*V*3/4); //else if(fCur>=fMax*2/3&&fCur<fMax) // MoneySpent += (INT)(V*V*fCur*6/(4*fMax)+V*V/4); MoneySpent += (INT) ( ((REPAIR_SPEND * (1- fCur/fMax) * V) * pShop->m_nRepairSpend) + 0.99); if(MoneyHave>=MoneySpent) {//可以修 pHuman->SetMoney(MoneyHave - MoneySpent); MONEY_LOG_PARAM MoneyLogParam; MoneyLogParam.CharGUID = pHuman->GetGUID(); MoneyLogParam.OPType = MONEY_SHOP_REPAIR; MoneyLogParam.Count = MoneySpent; MoneyLogParam.SceneID = pHuman->getScene()->SceneID(); MoneyLogParam.XPos = pHuman->getWorldPos()->m_fX; MoneyLogParam.ZPos = pHuman->getWorldPos()->m_fZ; SaveMoneyLog(&MoneyLogParam); HumanItemLogic::SetBagItemDur(pHuman,(UINT)BagIndex,(INT)fMax); ItemList[0].IsIn = GCShopRepair::BAG; ItemList[0].BagIndex = (BYTE)BagIndex; Msg.SetAll(0); Msg.SetReListNum(1); Msg.SetReList(ItemList); pHuman->GetPlayer()->SendPacket(&Msg); } else {//没钱还捣乱 GCShopBuy Msg ; Msg.SetBuyOk((BYTE)GCShopBuy::BUY_MONEY_FAIL); pHuman->GetPlayer()->SendPacket( &Msg ) ; g_pLog->FastSaveLog( LOG_FILE_1, "CGShopRepairHandler BUY_MONEY_FAIL") ; return PACKET_EXE_CONTINUE ; } } } else { g_pLog->FastSaveLog( LOG_FILE_1, "CGShopRepairHandler BagIndex = %d", BagIndex) ; return PACKET_EXE_CONTINUE ; } } } else if(Opt == CGShopRepair::FromEquip) { pCurItem = HumanItemLogic::GetEquip(pHuman,(HUMAN_EQUIP)BagIndex); if(!pCurItem->IsEmpty()) {//有东西 FLOAT fCur = (FLOAT)pCurItem->GetDurPoints(); FLOAT fMax = (FLOAT)pCurItem->GetMaxDurPoint(); FLOAT V = (FLOAT)pCurItem->GetPrice(); { if(pCurItem->GetRequireLevel()>pShop->m_nRepairLevel) { g_pLog->FastSaveLog( LOG_FILE_1, "CGShopRepairHandler Npc have no the Repair Levle") ; return PACKET_EXE_CONTINUE; } BOOL bCanRepair = TRUE; switch( pShop->m_nRepairType ) { case SHOP_All: { } break; case SHOP_DEFENCE: //防具 { if( pCurItem->GetEquipPoint() != HEQUIP_CAP && pCurItem->GetEquipPoint() != HEQUIP_ARMOR && pCurItem->GetEquipPoint() != HEQUIP_CUFF && pCurItem->GetEquipPoint() != HEQUIP_BOOT ) { bCanRepair = FALSE; } } break; case SHOP_ADORN: //饰物 { if( pCurItem->GetEquipPoint() != HEQUIP_SASH && pCurItem->GetEquipPoint() != HEQUIP_RING && pCurItem->GetEquipPoint() != HEQUIP_NECKLACE && pCurItem->GetEquipPoint() != HEQUIP_RIDER) { bCanRepair = FALSE; } } break; case SHOP_WEAPON: //武器 { if( pCurItem->GetEquipPoint() != HEQUIP_WEAPON ) { bCanRepair = FALSE; } } break; default: { bCanRepair = FALSE; } break; } if(bCanRepair == FALSE) { g_pLog->FastSaveLog( LOG_FILE_1, "CGShopRepairHandler Npc have no the Repair type") ; return PACKET_EXE_CONTINUE; } } if(fCur != fMax) { //if(fCur<fMax/3) // MoneySpent += (INT)(7*V*V*fCur*6/(4*fMax)+V*V); //else if(fCur>=fMax/3&&fCur<fMax*2/3) // MoneySpent += (INT)(V*V*fCur*6/fMax+V*V*3/4); //else if(fCur>=fMax*2/3&&fCur<fMax) // MoneySpent += (INT)(V*V*fCur*6/(4*fMax)+V*V/4); MoneySpent += (INT) ( ((REPAIR_SPEND * (1- fCur/fMax) * V) * pShop->m_nRepairSpend) + 0.5); if(MoneyHave>=MoneySpent) {//可以修 pHuman->SetMoney(MoneyHave - MoneySpent); MONEY_LOG_PARAM MoneyLogParam; MoneyLogParam.CharGUID = pHuman->GetGUID(); MoneyLogParam.OPType = MONEY_SHOP_REPAIR; MoneyLogParam.Count = MoneySpent; MoneyLogParam.SceneID = pHuman->getScene()->SceneID(); MoneyLogParam.XPos = pHuman->getWorldPos()->m_fX; MoneyLogParam.ZPos = pHuman->getWorldPos()->m_fZ; SaveMoneyLog(&MoneyLogParam); HumanItemLogic::SetEquipDur(pHuman,(HUMAN_EQUIP)BagIndex,(INT)fMax); ItemList[0].IsIn = GCShopRepair::EQUIP; ItemList[0].BagIndex = (BYTE)BagIndex; Msg.SetAll(0); Msg.SetReListNum(1); Msg.SetReList(ItemList); pHuman->GetPlayer()->SendPacket(&Msg); } else {//没钱还捣乱 GCShopBuy Msg ; Msg.SetBuyOk((BYTE)GCShopBuy::BUY_MONEY_FAIL); pHuman->GetPlayer()->SendPacket( &Msg ) ; g_pLog->FastSaveLog( LOG_FILE_1, "CGShopRepairHandler BUY_MONEY_FAIL") ; return PACKET_EXE_CONTINUE ; } } } } return PACKET_EXE_CONTINUE; __LEAVE_FUNCTION return PACKET_EXE_ERROR ; }
UINT CGPlayerShopMoneyHandler::Execute( CGPlayerShopMoney* pPacket, Player* pPlayer ) { __ENTER_FUNCTION GamePlayer* pGamePlayer = (GamePlayer*)pPlayer ; Assert( pGamePlayer ) ; Obj_Human* pHuman = pGamePlayer->GetHuman() ; Assert( pHuman ) ; Scene* pScene = pHuman->getScene() ; if( pScene==NULL ) { Assert(FALSE) ; return PACKET_EXE_ERROR ; } //检查线程执行资源是否正确 Assert( MyGetCurrentThreadID()==pScene->m_ThreadID ) ; _PLAYERSHOP_GUID nShopID = pPacket->GetShopID(); //商店ID BYTE nOpt = pPacket->GetOpt(); //操作 BYTE nType = pPacket->GetType(); //存到哪 UINT uAmount = pPacket->GetAmount(); //数量 BYTE nShopSerial = pPacket->GetShopSerial(); //商店序列号 GCPlayerShopError MsgError; PlayerShopManager* pPlayerShopManager = pScene->GetPlayerShopManager(); PlayerShop* pPlayerShop = pPlayerShopManager->GetPlayerShopByGUID(nShopID); Assert(pPlayerShop); if(pPlayerShop->GetShopStatus() == STATUS_PLAYER_SHOP_ON_SALE) {//商店未开张 g_pLog->FastSaveLog( LOG_FILE_1, "CGPlayerShopMoneyHandler::Name=%s shop close" ,pHuman->GetName()) ; return PACKET_EXE_CONTINUE ; } //是不是自己的店 BOOL bIsMine = (pHuman->GetGUID() == pPlayerShop->GetOwnerGuid())? TRUE:FALSE; //是不是自己可以管理的店 BOOL bCanManager = pPlayerShop->IsPartner(pHuman->GetGUID()); if(bIsMine == FALSE && bCanManager == FALSE) { //log... return PACKET_EXE_CONTINUE; } if(nShopSerial != pPlayerShop->GetSerial()) { MsgError.SetID(PLAYERSHOP_MSG::ERR_SHOP_SALE_OUT_SERIAL_IS_CHANGED); pGamePlayer->SendPacket(&MsgError); g_pLog->FastSaveLog( LOG_FILE_1, "CGItemSynchHandler::Name=%s Serials had changed" ,pHuman->GetName()) ; return PACKET_EXE_CONTINUE ; } GCPlayerShopMoney MsgToClient; MsgToClient.SetShopID(nShopID); switch(nOpt) { case CGPlayerShopMoney::OPT_SAVE_MONEY: {//存钱 if(pHuman->GetMoney() < uAmount) { Assert(0); g_pLog->FastSaveLog( LOG_FILE_1, "ERROR:CGPlayerShopMoneyHandler::Name=%s, Out Of Money In Packet" ,pHuman->GetName()) ; return PACKET_EXE_CONTINUE ; } if(nType == CGPlayerShopMoney::TYPE_BASE_MONEY) { UINT uBaseMoney = pPlayerShop->GetBaseMoney(); if(uBaseMoney+uAmount > 10000000) {//超过1000金 Assert(0); g_pLog->FastSaveLog( LOG_FILE_1, "ERROR:CGPlayerShopMoneyHandler::Name=%s, uBaseMoney+uAmount > 10000000" ,pHuman->GetName()) ; return PACKET_EXE_CONTINUE ; } UINT uRealBaseMoney = (UINT)(uBaseMoney+(FLOAT)uAmount*(1-0.03)); pPlayerShop->SetBaseMoney(uRealBaseMoney); //充入本金:AAA往店铺本金中充入(换行)?金?银?铜(AAA为操作者名) RecordOpt::Excute(REC_INPUT_BASE, pPlayerShop->GetManagerRecord(), (CHAR*)pHuman->GetName(), (INT)(uRealBaseMoney - uBaseMoney)); MsgToClient.SetType(GCPlayerShopMoney::TYPE_BASE_MONEY); MsgToClient.SetAmount(uRealBaseMoney); MsgToClient.SetShopSerial(pPlayerShop->IncSerial()); pGamePlayer->SendPacket(&MsgToClient); } else if(nType == CGPlayerShopMoney::TYPE_PROFIT_MONEY) { UINT uProfitMoney = pPlayerShop->GetProfitMoney(); UINT uRealProfitMoney = (UINT)(uProfitMoney+(FLOAT)uAmount*(1-0.03)); pPlayerShop->SetProfitMoney(uRealProfitMoney); MsgToClient.SetType(GCPlayerShopMoney::TYPE_PROFIT_MONEY); MsgToClient.SetAmount(uRealProfitMoney); MsgToClient.SetShopSerial(pPlayerShop->IncSerial()); //充入赢利资金:AAA往店铺赢利资金中充入(换行)?金?银?铜(AAA为操作者名) RecordOpt::Excute(REC_INPUT_PROFIT, pPlayerShop->GetManagerRecord(), (CHAR*)pHuman->GetName(), (INT)(uRealProfitMoney - uProfitMoney)); pGamePlayer->SendPacket(&MsgToClient); } pHuman->SetMoney(pHuman->GetMoney() - uAmount); MONEY_LOG_PARAM MoneyLogParam; MoneyLogParam.CharGUID = pHuman->GetGUID(); MoneyLogParam.TargetGUID = pPlayerShop->GetOwnerGuid(); MoneyLogParam.OPType = MONEY_PLAYERSHOP_SAVE; MoneyLogParam.Count = uAmount; MoneyLogParam.SceneID = pHuman->getScene()->SceneID(); MoneyLogParam.XPos = pHuman->getWorldPos()->m_fX; MoneyLogParam.ZPos = pHuman->getWorldPos()->m_fZ; SaveMoneyLog(&MoneyLogParam); } break; case CGPlayerShopMoney::OPT_GET_MONEY: {//取钱 if(nType == CGPlayerShopMoney::TYPE_BASE_MONEY) { UINT uBaseMoney = pPlayerShop->GetBaseMoney(); if(uBaseMoney < uAmount) { Assert(0); g_pLog->FastSaveLog( LOG_FILE_1, "ERROR:CGPlayerShopMoneyHandler::Name=%s, Out Of Money In ShopBase" ,pHuman->GetName()) ; return PACKET_EXE_CONTINUE ; } pPlayerShop->SetBaseMoney(uBaseMoney-uAmount); MsgToClient.SetType(GCPlayerShopMoney::TYPE_BASE_MONEY); MsgToClient.SetAmount(uBaseMoney-uAmount); MsgToClient.SetShopSerial(pPlayerShop->IncSerial()); pGamePlayer->SendPacket(&MsgToClient); } else if(nType == CGPlayerShopMoney::TYPE_PROFIT_MONEY) { UINT uProfitMoney = pPlayerShop->GetProfitMoney(); if(uProfitMoney < uAmount) { Assert(0); g_pLog->FastSaveLog( LOG_FILE_1, "ERROR:CGPlayerShopMoneyHandler::Name=%s, Out Of Money In ShopProfit" ,pHuman->GetName()) ; return PACKET_EXE_CONTINUE ; } pPlayerShop->SetProfitMoney(uProfitMoney-uAmount); MsgToClient.SetType(GCPlayerShopMoney::TYPE_PROFIT_MONEY); MsgToClient.SetAmount(uProfitMoney-uAmount); MsgToClient.SetShopSerial(pPlayerShop->IncSerial()); pGamePlayer->SendPacket(&MsgToClient); } pHuman->SetMoney(pHuman->GetMoney() + uAmount); MONEY_LOG_PARAM MoneyLogParam; MoneyLogParam.CharGUID = pHuman->GetGUID(); MoneyLogParam.TargetGUID = pPlayerShop->GetOwnerGuid(); MoneyLogParam.OPType = MONEY_PLAYERSHOP_WITHDRAW; MoneyLogParam.Count = uAmount; MoneyLogParam.SceneID = pHuman->getScene()->SceneID(); MoneyLogParam.XPos = pHuman->getWorldPos()->m_fX; MoneyLogParam.ZPos = pHuman->getWorldPos()->m_fZ; SaveMoneyLog(&MoneyLogParam); } break; default: break; } g_pLog->FastSaveLog( LOG_FILE_1, "CGPlayerShopMoneyHandler::Name=%s" ,pHuman->GetName()) ; return PACKET_EXE_CONTINUE ; __LEAVE_FUNCTION return PACKET_EXE_ERROR ; }
uint CGShopSellHandler::Execute( CGShopSell* pPacket, Player* pPlayer ) { __ENTER_FUNCTION GamePlayer* pGamePlayer = (GamePlayer*)pPlayer ; Assert( pGamePlayer ) ; Obj_Human* pHuman = pGamePlayer->GetHuman() ; Assert( pHuman ) ; Scene* pScene = pHuman->getScene() ; if( pScene==NULL ) { Assert(FALSE) ; return PACKET_EXE_ERROR ; } //检查线程执行资源是否正确 Assert( MyGetCurrentThreadID()==pScene->m_ThreadID ) ; BYTE m_nBagIndex = pPacket->GetBagIndex(); //包中的位置 UINT UniqueID = pPacket->GetUniqueID(); SceneID_t SceneID = UniqueID>>16; ObjID_t NpcObjID= UniqueID&0x00ff; if(SceneID != pScene->SceneID()) { g_pLog->FastSaveLog( LOG_FILE_1, "CGShopSellHandler Illegal scene ObjName = %s", pHuman->GetName()) ; return PACKET_EXE_CONTINUE ; } //距离判定 Obj* pNpcObj = (Obj*) (pScene->GetObjManager()->GetObj(NpcObjID)); if(pNpcObj == NULL) { g_pLog->FastSaveLog( LOG_FILE_1, "CGShopSellHandler Illegal Obj ObjName = %s", pHuman->GetName()) ; return PACKET_EXE_CONTINUE ; } FLOAT fDist = MySqrt(pNpcObj->getWorldPos(), pHuman->getWorldPos()); if(fDist>MAX_NPC_DISTANCE) { g_pLog->FastSaveLog( LOG_FILE_1, "CGShopSellHandler Out Of Range ObjName = %s", pHuman->GetName()) ; return PACKET_EXE_CONTINUE ; } Item* pCurrentItem = HumanItemLogic::GetItem(pHuman,m_nBagIndex); if(!pCurrentItem||ConvertSerial2ItemType(pCurrentItem->GetItemTableIndex()).isNull()) { //背包索引不存在 g_pLog->FastSaveLog( LOG_FILE_1, "ERROR:CGShopSellHandler m_nBagIndex=%d PlayerName=s%", m_nBagIndex, pHuman->GetName()) ; return PACKET_EXE_CONTINUE; } //判定这个商人是不是收购这个物品 _SHOP* pShop = pHuman->Shop( ) ; //商店不存在 if(!pShop) { g_pLog->FastSaveLog( LOG_FILE_1, "ERROR:CGShopSellHandler Npc Shop Lose"); return PACKET_EXE_CONTINUE; } //查询收购等级限制 if( pCurrentItem->GetItemClass() == ICLASS_EQUIP ) { if( pCurrentItem->GetRequireLevel() > pShop->m_nBuyLevel ) { return PACKET_EXE_CONTINUE; } } else { if( pCurrentItem->GetItemLevel() > pShop->m_nBuyLevel ) { return PACKET_EXE_CONTINUE; } } BOOL bCanBuy = TRUE; if(pShop->m_nBuyType != SHOP_All) { switch(pShop->m_nBuyType) { case SHOP_All: { } break; case SHOP_DEFENCE: //防具 { if( ICLASS_EQUIP == pCurrentItem->GetItemClass()) { if( pCurrentItem->GetEquipPoint() != HEQUIP_CAP && pCurrentItem->GetEquipPoint() != HEQUIP_ARMOR && pCurrentItem->GetEquipPoint() != HEQUIP_CUFF && pCurrentItem->GetEquipPoint() != HEQUIP_BOOT ) { bCanBuy = FALSE; } } else { bCanBuy = FALSE; } } break; case SHOP_ADORN: //饰物 { if( ICLASS_EQUIP == pCurrentItem->GetItemClass()) { if( pCurrentItem->GetEquipPoint() != HEQUIP_SASH && pCurrentItem->GetEquipPoint() != HEQUIP_RING && pCurrentItem->GetEquipPoint() != HEQUIP_NECKLACE && pCurrentItem->GetEquipPoint() != HEQUIP_RIDER) { bCanBuy = FALSE; } } else { bCanBuy = FALSE; } } break; case SHOP_WEAPON: //武器 { if( ICLASS_EQUIP == pCurrentItem->GetItemClass()) { if( pCurrentItem->GetEquipPoint() != HEQUIP_WEAPON ) { bCanBuy = FALSE; } } else { bCanBuy = FALSE; } } break; case SHOP_FOOD: //食物 { if( ICLASS_COMITEM != pCurrentItem->GetItemClass()) { bCanBuy = FALSE; } } break; case SHOP_MATERIAL: //材料 { if( ICLASS_MATERIAL != pCurrentItem->GetItemClass()) { bCanBuy = FALSE; } } break; case SHOP_COMITEM: //药品 { if( ICLASS_COMITEM != pCurrentItem->GetItemClass()) { bCanBuy = FALSE; } } break; default: { bCanBuy = FALSE; break; } } } //是否返回失败消息??? if(bCanBuy == FALSE) { return PACKET_EXE_CONTINUE; } INT iPrice = ShopMgr::ConvertItemType2Money(ConvertSerial2ItemType(pCurrentItem->GetItemTableIndex())); iPrice *= pCurrentItem->GetLayedNum(); //2006-4-21 //玩家向商店出售已经鉴定过的物品或者无需鉴定的物品按照基础价格*系数A(=1/3) 计算; //若出售未鉴定物品,价格应该更低,设此价格系数为B(=1/10),这个有待于调整,请在config中开放调整A,B的接口。 //耐久衰减系数D=当前耐久/最大耐久 //修理失败衰减次数F=1/(修理失败次数+1) //因此最终的出售价格为V=基础价格B*A*D*F //再乘以商店得价格比例 FLOAT fCur = 1; FLOAT fMax = 1; INT iFailTimes = 0; if(pCurrentItem->GetItemClass() == ICLASS_EQUIP) { fCur = (FLOAT)pCurrentItem->GetDurPoints(); fMax = (FLOAT)pCurrentItem->GetMaxDurPoint(); iFailTimes = pCurrentItem->GetFailTimes(); } if(pCurrentItem->GetItemIdent()) { iPrice = (INT)( ((FLOAT)iPrice/(FLOAT)3.0) * (fCur/fMax) * ((FLOAT)1/(FLOAT)(iFailTimes+1)) * (pShop->m_scale) ); } else { iPrice = (INT)( ((FLOAT)iPrice/(FLOAT)10.0) * (fCur/fMax) * ((FLOAT)1/(FLOAT)(iFailTimes+1)) * (pShop->m_scale) ); } //备份一下,一会儿放到购回列表里 _ITEM tempitem; pCurrentItem->SaveValueTo(&tempitem); //备份到回购列表中 pHuman->AddToSoldList(m_nBagIndex, iPrice); //给钱 pHuman->SetMoney( pHuman->GetMoney() + iPrice); MONEY_LOG_PARAM MoneyLogParam; MoneyLogParam.CharGUID = pHuman->GetGUID(); MoneyLogParam.OPType = MONEY_SHOP_SELL; MoneyLogParam.Count = iPrice; MoneyLogParam.SceneID = pHuman->getScene()->SceneID(); MoneyLogParam.XPos = pHuman->getWorldPos()->m_fX; MoneyLogParam.ZPos = pHuman->getWorldPos()->m_fZ; SaveMoneyLog(&MoneyLogParam); //把这个回购商品显示到界面 GCShopSoldList::_MERCHANDISE_ITEM SoldItem; SoldItem.item_data = tempitem; GCShopSoldList MsgSold; MsgSold.SetMerchadiseNum(1); MsgSold.SetMerchadiseList(&SoldItem); pHuman->GetPlayer()->SendPacket( &MsgSold ); GCShopSell MsgSell; pHuman->GetPlayer()->SendPacket( &MsgSell ); g_pLog->FastSaveLog( LOG_FILE_1, "CGShopSellHandler m_nBagIndex=%d ", m_nBagIndex ) ; return PACKET_EXE_CONTINUE; __LEAVE_FUNCTION return PACKET_EXE_ERROR ; }
UINT CGAskLeanAbilityHandler::Execute( CGAskLeanAbility* pPacket, Player* pPlayer ) { __ENTER_FUNCTION GamePlayer* pGamePlayer = (GamePlayer*)pPlayer; Assert( pGamePlayer ); Obj_Human* pHuman = pGamePlayer->GetHuman(); Assert( pHuman ); Assert(pPacket); //判定升级条件是否满足(Money,Exp,SkillExp) AbilityID_t nId = pPacket->GetAbilityTeacherInfo(); UINT nNeedMoney = (UINT)pPacket->GetNeedMoney(); UINT nNeedExp = (UINT)pPacket->GetNeedExp(); INT nNeedSkillExp = pPacket->GetNeedSkillExp(); INT nMyLevel = pHuman->__GetAbilityLevel(nId); Ability* pAbility = g_pAbilityManager->GetAbility(nId); INT SkillExp = pHuman->__GetAbilityExp(nId); if( nNeedMoney <= pHuman->GetDB()->GetMoney() && nNeedExp <= pHuman->GetDB()->GetExp() && nNeedSkillExp <= pHuman->__GetAbilityExp(nId) && nMyLevel <= pAbility->AbilityLevelLimit()) { // 升级技能 INT nMyLevel = pHuman->__GetAbilityLevel(nId); pHuman->__SetAbilityLevel(nId, nMyLevel + 1); // 扣除金钱和经验值 UINT uSpareExp = pHuman->GetDB()->GetExp() - (UINT)nNeedExp; UINT uSpareMoney = pHuman->GetDB()->GetMoney() - (UINT)nNeedMoney; pHuman->GetDB()->SetExp(uSpareExp ); pHuman->GetDB()->SetMoney(uSpareMoney ); MONEY_LOG_PARAM MoneyLogParam; MoneyLogParam.CharGUID = pHuman->GetGUID(); MoneyLogParam.OPType = MONEY_LEARN_ABILITY_COST; MoneyLogParam.Count = nNeedMoney; MoneyLogParam.SceneID = pHuman->getScene()->SceneID(); MoneyLogParam.XPos = pHuman->getWorldPos()->m_fX; MoneyLogParam.ZPos = pHuman->getWorldPos()->m_fZ; SaveMoneyLog(&MoneyLogParam); //调用修改客户端生活技能的消息 //修改生活技能等级 GCAbilityLevel MsgLevel; MsgLevel.setAbilityId(nId); MsgLevel.setLevel(nMyLevel + 1); pPlayer = pHuman->GetPlayer(); pPlayer->SendPacket( &MsgLevel ) ; } else { //升级失败的提示 ; } return PACKET_EXE_CONTINUE ; __LEAVE_FUNCTION return PACKET_EXE_ERROR ; }
UINT CGBankMoneyHandler::Execute( CGBankMoney* pPacket, Player* pPlayer ) { __ENTER_FUNCTION GamePlayer* pGamePlayer = (GamePlayer*)pPlayer ; Assert( pGamePlayer ) ; Obj_Human* pHuman = pGamePlayer->GetHuman() ; Assert( pHuman ) ; Scene* pScene = pHuman->getScene() ; if( pScene==NULL ) { Assert(FALSE) ; return PACKET_EXE_ERROR ; } //检查线程执行资源是否正确 Assert( MyGetCurrentThreadID()==pScene->m_ThreadID ) ; BYTE IsSave = pPacket->GetSaveType(); INT Amount = pPacket->GetAmount(); INT AmountRMB = pPacket->GetAmountRMB(); INT CurMoney = pHuman->__GetBankMoney(); INT CurRMB = pHuman->GetBankRMB(); if(IsSave & CGBankMoney::SAVE_MONEY) { if( Amount>(INT)(pHuman->GetMoney()) ) { Amount = pHuman->GetMoney(); } CurMoney += Amount; //将来要判一下是否大于银行能存的最大上限 if(CurMoney>MAX_BANK_MONEY) CurMoney = MAX_BANK_MONEY; pHuman->__SetBankMoney(CurMoney); pHuman->SetMoney(pHuman->GetMoney() - Amount); MONEY_LOG_PARAM MoneyLogParam; MoneyLogParam.CharGUID = pHuman->GetGUID(); MoneyLogParam.OPType = MONEY_BANK_SAVE; MoneyLogParam.Count = Amount; MoneyLogParam.SceneID = pHuman->getScene()->SceneID(); MoneyLogParam.XPos = pHuman->getWorldPos()->m_fX; MoneyLogParam.ZPos = pHuman->getWorldPos()->m_fZ; SaveMoneyLog(&MoneyLogParam); } else if(IsSave & CGBankMoney::PUTOUT_MONEY) { if(CurMoney - Amount < 0) Amount = CurMoney; pHuman->__SetBankMoney(CurMoney - Amount); pHuman->SetMoney(pHuman->GetMoney() + Amount); MONEY_LOG_PARAM MoneyLogParam; MoneyLogParam.CharGUID = pHuman->GetGUID(); MoneyLogParam.OPType = MONEY_BANK_WITHDRAW; MoneyLogParam.Count = Amount; MoneyLogParam.SceneID = pHuman->getScene()->SceneID(); MoneyLogParam.XPos = pHuman->getWorldPos()->m_fX; MoneyLogParam.ZPos = pHuman->getWorldPos()->m_fZ; SaveMoneyLog(&MoneyLogParam); } else if(IsSave & CGBankMoney::UPDATE_MONEY) { Amount = CurMoney; } if( IsSave & CGBankMoney::SAVE_RMB ) { if( AmountRMB > pHuman->GetRMB() ) { AmountRMB = pHuman->GetRMB(); } CurRMB += AmountRMB; if(CurRMB>MAX_BANK_RMB) CurRMB = MAX_BANK_RMB; pHuman->SetBankRMB(CurRMB); pHuman->SetRMB( pHuman->GetRMB() - AmountRMB ); MONEY_LOG_PARAM MoneyLogParam; MoneyLogParam.CharGUID = pHuman->GetGUID(); MoneyLogParam.OPType = MONEY_BANK_SAVERMB; MoneyLogParam.Count = Amount; MoneyLogParam.SceneID = pHuman->getScene()->SceneID(); MoneyLogParam.XPos = pHuman->getWorldPos()->m_fX; MoneyLogParam.ZPos = pHuman->getWorldPos()->m_fZ; SaveMoneyLog(&MoneyLogParam); } else if( IsSave & CGBankMoney::PUTOUT_RMB ) { if(CurRMB - AmountRMB < 0) AmountRMB = CurRMB; pHuman->SetBankRMB(CurRMB - AmountRMB); pHuman->SetRMB(pHuman->GetRMB() + AmountRMB); MONEY_LOG_PARAM MoneyLogParam; MoneyLogParam.CharGUID = pHuman->GetGUID(); MoneyLogParam.OPType = MONEY_BANK_WITHDRAWRMB; MoneyLogParam.Count = Amount; MoneyLogParam.SceneID = pHuman->getScene()->SceneID(); MoneyLogParam.XPos = pHuman->getWorldPos()->m_fX; MoneyLogParam.ZPos = pHuman->getWorldPos()->m_fZ; SaveMoneyLog(&MoneyLogParam); } else if( IsSave & CGBankMoney::UPDATA_RMB ) { AmountRMB = CurRMB; } GCBankMoney Msg; Msg.SetSaveType(IsSave); Msg.SetAmount(Amount); Msg.SetAmountRMB(AmountRMB); pPlayer = pHuman->GetPlayer(); pPlayer->SendPacket( &Msg ) ; g_pLog->FastSaveLog( LOG_FILE_1, "CGBankMoneyHandler: Issave=%d, Amount=%d, AmountRMB=%d", (INT)IsSave, Amount, AmountRMB ) ; return PACKET_EXE_CONTINUE ; __LEAVE_FUNCTION return PACKET_EXE_ERROR ; }
UINT CGPlayerShopEstablishHandler::Execute( CGPlayerShopEstablish* pPacket, Player* pPlayer ) { __ENTER_FUNCTION GamePlayer* pGamePlayer = (GamePlayer*)pPlayer ; Assert( pGamePlayer ) ; Obj_Human* pHuman = pGamePlayer->GetHuman() ; Assert( pHuman ) ; Scene* pScene = pHuman->getScene() ; if( pScene==NULL ) { Assert(FALSE) ; return PACKET_EXE_ERROR ; } //检查线程执行资源是否正确 Assert( MyGetCurrentThreadID()==pScene->m_ThreadID ) ; CHAR* pszShopName = pPacket->GetShopName(); BYTE nShopNameSize = pPacket->GetShopNameSize(); BYTE nShopType = pPacket->GetType(); SceneID_t sceneid = pScene->SceneID(); GCPlayerShopError MsgError; PlayerShopManager* pPlayerShopManager = pScene->GetPlayerShopManager(); pPlayerShopManager->ClampComFactor(); FLOAT CommercialFactor = pPlayerShopManager->GetComFactor(); UINT uCost = (UINT)(300000*CommercialFactor*2*1.03); //金钱验证 if(uCost>pHuman->GetMoney()) { g_pLog->FastSaveLog( LOG_FILE_1, "ERROR: CGPlayerShopApplyHandler::Name=%s Cost = %d Money = %d ", pHuman->GetName(), uCost, pHuman->GetMoney() ) ; MsgError.SetID(PLAYERSHOP_MSG::ERR_NOT_ENOUGH_MONEY_TO_NEW); pGamePlayer->SendPacket(&MsgError); return PACKET_EXE_CONTINUE ; } //需要再验证是不是已经建立满了商店了 if(nShopType == PLAYERSHOP_MSG::TYPE_ITEM) { if( !pHuman->GetShopGuid(0).isNull() ) { PlayerShop* pCurShop = pPlayerShopManager->GetPlayerShopByGUID(pHuman->GetShopGuid(0)); if(!pCurShop) { pHuman->GetShopGuid(0).Reset(); } else if(pCurShop->GetOwnerGuid() == pHuman->GetGUID()) { g_pLog->FastSaveLog( LOG_FILE_1, "ERROR: CGPlayerShopApplyHandler::Name=%s Can not create shop", pHuman->GetName()) ; MsgError.SetID(PLAYERSHOP_MSG::ERR_SHOP_ALREADY_EXIST); pGamePlayer->SendPacket(&MsgError); return PACKET_EXE_CONTINUE ; } else { pHuman->GetShopGuid(0).Reset(); } } } else if(nShopType == PLAYERSHOP_MSG::TYPE_PET) { if( !pHuman->GetShopGuid(1).isNull() ) { PlayerShop* pCurShop = pPlayerShopManager->GetPlayerShopByGUID(pHuman->GetShopGuid(1)); if(!pCurShop) { pHuman->GetShopGuid(1).Reset(); } else if(pCurShop->GetOwnerGuid() == pHuman->GetGUID()) { g_pLog->FastSaveLog( LOG_FILE_1, "ERROR: CGPlayerShopApplyHandler::Name=%s Can not create shop", pHuman->GetName()) ; MsgError.SetID(PLAYERSHOP_MSG::ERR_SHOP_ALREADY_EXIST); pGamePlayer->SendPacket(&MsgError); return PACKET_EXE_CONTINUE ; } else { pHuman->GetShopGuid(1).Reset(); } } } else { Assert(0); g_pLog->FastSaveLog( LOG_FILE_1, "ERROR: CGPlayerShopApplyHandler::Name=%s Can not create shop", pHuman->GetName(), uCost, pHuman->GetMoney() ) ; MsgError.SetID(PLAYERSHOP_MSG::ERR_SHOP_ALREADY_EXIST); pGamePlayer->SendPacket(&MsgError); return PACKET_EXE_CONTINUE ; } //... //重名验证 for(UINT i =0; i<MAX_SHOP_NUM_PER_SCENE; i++) { PlayerShop* pTempShop = pPlayerShopManager->GetPlayerShopByIndex(i); if(!pTempShop) { continue; } else { if(!strcmp(pszShopName, pTempShop->GetShopName())) { g_pLog->FastSaveLog( LOG_FILE_1, "ERROR: CGPlayerShopApplyHandler::Name = %s This name has already existed", pHuman->GetName()) ; MsgError.SetID(PLAYERSHOP_MSG::ERR_NAME_ALREADY_EXISTED); pGamePlayer->SendPacket(&MsgError); return PACKET_EXE_CONTINUE ; } } } //New一个商店 INT nIndex = pPlayerShopManager->NewPlayerShop(); if(nIndex < 0) { MsgError.SetID(PLAYERSHOP_MSG::ERR_NOT_ENOUGH_SHOP_IN_POOL); pGamePlayer->SendPacket(&MsgError); g_pLog->FastSaveLog( LOG_FILE_1, "ERROR: CGPlayerShopEstablishHandler::Name=%s OUT OF SHOP POOL", pHuman->GetName()) ; return PACKET_EXE_CONTINUE ; } PlayerShop* pPlayerShop = pPlayerShopManager->GetPlayerShopByIndex(nIndex); //时间采样 UINT nYear = (UINT)g_pTimeManager->GetYear(); BYTE nMonth = (BYTE)g_pTimeManager->GetMonth(); BYTE nDay = (BYTE)g_pTimeManager->GetDay(); BYTE nHour = (BYTE)g_pTimeManager->GetHour(); BYTE nMin = (BYTE)g_pTimeManager->GetMinute(); //开张了 pPlayerShop->SetShopStatus(STATUS_PLAYER_SHOP_OPEN); //商店类型 if(nShopType == 1) {//物品点 pPlayerShop->SetShopType(TYPE_PLAYER_SHOP_ITEM); pHuman->SetShopGuid(0,pPlayerShop->GetShopGUID()); } else {//宠物店 pPlayerShop->SetShopType(TYPE_PLAYER_SHOP_PET); pHuman->SetShopGuid(1,pPlayerShop->GetShopGUID()); } //冲入本金 pPlayerShop->SetBaseMoney(uCost/2); //本金上限 pPlayerShop->SetMaxBaseMoney(uCost/2); //冲入投资金 pPlayerShop->SetProfitMoney(uCost/2); //商店名 pPlayerShop->SetShopName(pszShopName, nShopNameSize); //商店描述 pPlayerShop->SetShopDesc("",0); //店主名 pPlayerShop->SetOwnerName(pHuman->GetName()); //店主GUID pPlayerShop->SetOwnerGuid(pHuman->GetGUID()); //商店的建立时间 pPlayerShop->SetFoundedYear(nYear); pPlayerShop->SetFoundedMonth(nMonth); pPlayerShop->SetFoundedDay(nDay); pPlayerShop->SetFoundedHour(nHour); pPlayerShop->SetFoundedMin(nMin); //设置开放的柜台数 pPlayerShop->SetNumStallOpened(1); //设置开张的柜台数 pPlayerShop->SetNumStallOnSale(0); //柜台开张 PlayerStallBox* pNewPlayerStallBox = pPlayerShop->GetPlayerStallBoxByIndex(0); pNewPlayerStallBox->SetStallStatus(PLAYER_SHOP::STALL_CLOSE); //扣钱 pHuman->SetMoney(pHuman->GetMoney()-uCost); MONEY_LOG_PARAM MoneyLogParam; MoneyLogParam.CharGUID = pHuman->GetGUID(); MoneyLogParam.TargetGUID = pPlayerShop->GetOwnerGuid(); MoneyLogParam.OPType = MONEY_CREATE_PLAYERSHOP_OUTCOME; MoneyLogParam.Count = uCost; MoneyLogParam.SceneID = pHuman->getScene()->SceneID(); MoneyLogParam.XPos = pHuman->getWorldPos()->m_fX; MoneyLogParam.ZPos = pHuman->getWorldPos()->m_fZ; SaveMoneyLog(&MoneyLogParam); //"AAA(店铺唯一ID)开张大吉,大掌柜BBB(玩家自身名字)恭迎惠顾。" CHAR szMsgChat[256] = {0}; sprintf(szMsgChat, "@*;SrvMsg;CHAT_PS_OPEN;%s;%s", pszShopName, pHuman->GetName()); GWChat* pChatPacket = (GWChat*)(g_pPacketFactoryManager->CreatePacket(PACKET_GW_CHAT)) ; pChatPacket->SetSourGUID(pHuman->GetGUID()); pChatPacket->SetChatType( CHAT_TYPE_SYSTEM ) ; pChatPacket->SetContexSize( (BYTE)strlen(szMsgChat)) ; pChatPacket->SetContex( szMsgChat ) ; g_pServerManager->SendPacket( pChatPacket, INVALID_ID ); CHAR szMsgTitle[256] = {0}; sprintf(szMsgTitle, "%s大掌柜", pszShopName); pHuman->SetShangDianName(szMsgTitle,(BYTE)strlen(szMsgTitle)); pHuman->UpdateTitlesToClient(); GCPlayerShopEstablish Msg; Msg.SetShopName(pPlayerShop->GetShopName()); pGamePlayer->SendPacket(&Msg); g_pLog->FastSaveLog( LOG_FILE_1, "CGPlayerShopEstablishHandler::Name=%s" ,pHuman->GetName()) ; return PACKET_EXE_CONTINUE ; __LEAVE_FUNCTION return PACKET_EXE_ERROR ; }