UINT CGUnEquipHandler::Execute( CGUnEquip* 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 ) ; HUMAN_EQUIP EquipPoint = (HUMAN_EQUIP)pPacket->getEquipPoint(); //Assert( pHuman->GetDB()->GetEquipDB()->IsSet(EquipPoint) ) ; Item* pEquipItem = HumanItemLogic::GetEquip(pHuman,EquipPoint); if(!pEquipItem) { Assert(pEquipItem); return PACKET_EXE_CONTINUE; } if(pEquipItem->IsEmpty()) { return PACKET_EXE_CONTINUE; } UCHAR itemClass = pEquipItem->GetItemClass(); if(itemClass == ICLASS_EQUIP) { INT BagIndex;// = pHuman->GetFirstEmptyBagIndex(); ItemContainer* pEquipContainer = pHuman->GetEquipContain(); ItemContainer* pBaseContainer = pHuman->GetBaseContain(); if(!pEquipContainer) { Assert(pEquipItem); return PACKET_EXE_CONTINUE; } BYTE DeliverBagIndex = pPacket->getBagIndex(); if(DeliverBagIndex<pBaseContainer->GetContainerSize()) { BagIndex = g_ItemOperator.MoveItem(pEquipContainer, EquipPoint, pBaseContainer,DeliverBagIndex); } else { BagIndex = g_ItemOperator.MoveItem(pEquipContainer, EquipPoint, pBaseContainer); } GCUnEquipResult Msg; if(BagIndex>=0 && BagIndex<pBaseContainer->GetContainerSize()) { Msg.setEquipPoint(EquipPoint); Msg.setBagIndex(BagIndex); Msg.setItemID(pEquipItem->GetGUID()); Msg.setItemTableIndex(pEquipItem->GetItemTableIndex()); Msg.setResult(UNEQUIP_SUCCESS); pHuman->SetEquipVer(pHuman->GetEquipVer()+1); pHuman->ItemEffectFlush(); pGamePlayer->SendPacket( &Msg ) ; //如果可见 if(pHuman->IsVisualPart(EquipPoint)) { GCCharEquipment OtherMsg; OtherMsg.setObjID(pHuman->GetID()); //if(EquipPoint == HEQUIP_WEAPON) //{ // UINT uGemID = GetEquipmentMaxLevelGemID(pEquipItem); // OtherMsg.setID(EquipPoint,pEquipItem->GetItemTableIndex(), uGemID); //} //else //{ OtherMsg.setID(EquipPoint,pEquipItem->GetItemTableIndex(), -1); //} pScene->BroadCast(&OtherMsg,pHuman,TRUE); } } else { if(ITEMOE_DESTOPERATOR_HASITEM == BagIndex) { Msg.setResult(UNEQUIP_HAS_ITEM); pGamePlayer->SendPacket( &Msg ); } else if(ITEMOE_DESTOPERATOR_FULL == BagIndex) { Msg.setResult(UNEQUIP_BAG_FULL); pGamePlayer->SendPacket( &Msg ); } } } else { Assert(FALSE); //装备为什么不是 ICLASS_EQUIP } g_pLog->FastSaveLog( LOG_FILE_1, "CGUnEquipHandler EquipPoint=%d itemClass=%d", EquipPoint, itemClass ) ; return PACKET_EXE_CONTINUE ; __LEAVE_FUNCTION return PACKET_EXE_ERROR ; }
uint CGEquipSuitExchangeHandler::Execute(CGEquipSuitExchange* 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 ) ; //交易状态不可操作 if(pHuman->m_ExchangBox.m_Status > 0) {//丢弃 g_pLog->FastSaveLog( LOG_FILE_1, "ERROR: ObjID=%d, ExchangBox::m_Status>0" ,pHuman->GetID()) ; return PACKET_EXE_CONTINUE ; } //摆摊状态不可操作 if(pHuman->m_StallBox.GetStallStatus() == ServerStallBox::STALL_OPEN) {//丢弃 g_pLog->FastSaveLog( LOG_FILE_1, "ERROR: ObjID=%d, ServerStallBox::STALL_OPEN" ,pHuman->GetID()) ; return PACKET_EXE_CONTINUE ; } //切场景时丢弃换装消息 if(pGamePlayer->GetPlayerStatus()!=PS_SERVER_NORMAL || !pHuman->IsActiveObj() ) { g_pLog->FastSaveLog( LOG_FILE_1, "CGEquipSuitExchangeHandler: change scene") ; return PACKET_EXE_CONTINUE; } //摆摊不可操作 if(pHuman->m_StallBox.GetStallStatus() == ServerStallBox::STALL_OPEN) {//丢弃 g_pLog->FastSaveLog( LOG_FILE_1, "ERROR: ObjID=%d, ServerStallBox::STALL_OPEN" ,pHuman->GetID()) ; return PACKET_EXE_CONTINUE ; } UINT nSuitNum = pPacket->getEquipSuitNum(); if( nSuitNum > MAX_EQUIP_SUIT_NUM ) { return PACKET_EXE_ERROR ; } ItemContainer* pEquipContainer = pHuman->GetEquipContain(); Assert(pEquipContainer); _SUIT_SETTING suitSetting = pHuman->GetEquipSuitSetting(nSuitNum); GCEquipSuitExchangeResult Msg; GCDetailEquipList SelfMsg; GCCharEquipment OtherMsg; SelfMsg.setObjID( pHuman->GetID() ); BOOL bChange = FALSE; UINT RetPart = 0; //遍历所有套装 for(INT i=0; i<HEQUIP_NUMBER; ++i) { //存在套装数据 if(!suitSetting.m_EquipData[i].isNull()) { //检查装备栏 Item* pEquip = pEquipContainer->GetItem(i); Assert(pEquip); //装备有变化,装备栏数据与保存的对应位置套装信息不一致,需要到背包里找 if(!(pEquip->GetGUID() == suitSetting.m_EquipData[i])) { INT nPos = INVALID_INDEX; ItemContainer* pBagContainer = HumanItemLogic::GetBagItemContain(pHuman, &suitSetting.m_EquipData[i], nPos); //背包里也找不到,需记录下来(卖掉了?丢掉了?。。) if(nPos == INVALID_INDEX) { EXCHANGE_EQUIP_INFO ExchangeInfo; ExchangeInfo.m_BagIndex = INVALID_ITEM_POS; ExchangeInfo.m_EquipPoint = INVALID_ITEM_POS; Msg.setEquipInfo(ExchangeInfo, i); continue; } //找到了 Item* pExchangeItem = HumanItemLogic::GetBagItem(pHuman, nPos); Assert(pExchangeItem->GetItemClass() == ICLASS_EQUIP); if(pExchangeItem->GetEquipPoint() != i) { if(pExchangeItem->GetEquipPoint() == HEQUIP_RING1) { Assert(i == HEQUIP_RING2); } else if(pExchangeItem->GetEquipPoint() == HEQUIP_ADORN1) { Assert(i == HEQUIP_ADORN2); } else Assert(0); } //玩家可能等级变了 if(pExchangeItem->GetRequireLevel() > pHuman->GetLevel() ) { EXCHANGE_EQUIP_INFO ExchangeInfo; ExchangeInfo.m_BagIndex = INVALID_ITEM_POS; ExchangeInfo.m_EquipPoint = i; Msg.setEquipInfo(ExchangeInfo, i); g_pLog->FastSaveLog( LOG_FILE_1, "CGEquipSuitExchangeHandler: Equiplevel , pEquip->GetRequireLevel()=%d", pEquip->GetRequireLevel() ) ; continue; } //可能换职业了 if(!pExchangeItem->IsWuMenPai()) { if(!pExchangeItem->InReqJob(pHuman->GetMenPai())) { EXCHANGE_EQUIP_INFO ExchangeInfo; ExchangeInfo.m_BagIndex = INVALID_ITEM_POS; ExchangeInfo.m_EquipPoint = i; Msg.setEquipInfo(ExchangeInfo, i); g_pLog->FastSaveLog( LOG_FILE_1, "CGEquipSuitExchangeHandler: ReqJob") ; continue; } } if (pEquip->IsEmpty()) { g_ItemOperator.MoveItem( pBagContainer, pBagContainer->BagIndex2ConIndex(nPos), pEquipContainer, i ) ; } else { if (pBagContainer->IsCanUse()) { //与装备的物品进行交换 g_ItemOperator.ExchangeItem(pBagContainer, pBagContainer->BagIndex2ConIndex(nPos), pEquipContainer, i); } else //背包已经过期 { EXCHANGE_EQUIP_INFO ExchangeInfo; ExchangeInfo.m_BagIndex = INVALID_ITEM_POS; ExchangeInfo.m_EquipPoint = INVALID_ITEM_POS; Msg.setEquipInfo(ExchangeInfo, i); continue; } } EXCHANGE_EQUIP_INFO ExchangeInfo; ExchangeInfo.m_BagIndex = nPos; ExchangeInfo.m_EquipPoint = i; Msg.setEquipInfo(ExchangeInfo, i); //交换到人身上了,重新获取一下 Item* pEquipItem = HumanItemLogic::GetEquip(pHuman, (HUMAN_EQUIP)i); if(!pEquipItem) { Assert(FALSE); return PACKET_EXE_CONTINUE; } Assert(!pEquipItem->IsEmpty()); pEquipItem->SaveValueTo(SelfMsg.GetEquipData((HUMAN_EQUIP)i)); RetPart|=(1<<((UINT)i)); SelfMsg.SetAskPart(RetPart); RetPart = 0; //如果可见 if(pHuman->IsVisualPart((HUMAN_EQUIP)i)) { OtherMsg.setObjID(pHuman->GetID()); OtherMsg.setID((HUMAN_EQUIP)i, pEquipItem->GetItemTableIndex()); } //换装了 bChange = TRUE; } //装备正穿着呢,不需要通知 continue; } else { //根本没有呀 EXCHANGE_EQUIP_INFO ExchangeInfo; ExchangeInfo.m_BagIndex = INVALID_ITEM_POS; ExchangeInfo.m_EquipPoint = i; Msg.setEquipInfo(ExchangeInfo, i); } } if(bChange) { Msg.setResult(EQUIPSUIT_SUCCESS); pGamePlayer->SendPacket(&Msg); pGamePlayer->SendPacket( &SelfMsg ) ; pScene->BroadCast(&OtherMsg,pHuman,TRUE); pHuman->SetEquipVer(pHuman->GetEquipVer()+1); //刷新装备对人物的属性影响 pHuman->ItemEffectFlush(); } else { Msg.setResult(EQUIPSUIT_SUCCESS); pGamePlayer->SendPacket(&Msg); } g_pLog->FastSaveLog( LOG_FILE_1, "CGEquipSuitExchangeHandler: nSuitNum=%d", nSuitNum ) ; return PACKET_EXE_CONTINUE ; __LEAVE_FUNCTION return PACKET_EXE_ERROR ; }
uint CGCharAskEquipmentHandler::Execute( CGCharAskEquipment* 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 ) ; ObjID_t ObjID = pPacket->getObjID(); if( ObjID == INVALID_ID ) { Assert(FALSE) ; return PACKET_EXE_ERROR ; } Obj* pObj = pScene->GetObjManager()->GetObj( ObjID ) ; if( pObj==NULL ) { g_pLog->FastSaveLog( LOG_FILE_1, "CGCharAskEquipmentHandler: not find obj=%d", ObjID ) ; return PACKET_EXE_CONTINUE ; } if( !IsCharacterObj( pObj->GetObjType() ) ) { g_pLog->FastSaveLog( LOG_FILE_1, "CGCharAskEquipmentHandler: not character obj=%d", ObjID ) ; return PACKET_EXE_CONTINUE ; } Obj_Character* pCharacter = (Obj_Character*)pObj ; GCCharEquipment Msg; Msg.setObjID(pCharacter->GetID()); if ( pCharacter->GetObjType() == Obj::OBJ_TYPE_HUMAN ) { Obj_Human* pDest = (Obj_Human*)pCharacter ; if(pDest->GetEquipID(HEQUIP_WEAPON)> 0) { Msg.setWeaponID(pDest->GetEquipID(HEQUIP_WEAPON)); UINT uGemID = GetEquipmentMaxLevelGemID(pDest->GetEquipContain()->GetItem(HEQUIP_WEAPON)); Msg.setWeaponGemID(uGemID); } if(pDest->GetEquipID(HEQUIP_BOOT)>0) { Msg.setBootID(pDest->GetEquipID(HEQUIP_BOOT)); UINT uGemID = GetEquipmentMaxLevelGemID(pDest->GetEquipContain()->GetItem(HEQUIP_BOOT)); Msg.setBootGemID(uGemID); } if(pDest->GetEquipID(HEQUIP_CUFF)>0) { Msg.setCuffID(pDest->GetEquipID(HEQUIP_CUFF)); UINT uGemID = GetEquipmentMaxLevelGemID(pDest->GetEquipContain()->GetItem(HEQUIP_CUFF)); Msg.setCuffGemID(uGemID); } if(pDest->GetEquipID(HEQUIP_CAP)>0) { Msg.setCapID(pDest->GetEquipID(HEQUIP_CAP)); UINT uGemID = GetEquipmentMaxLevelGemID(pDest->GetEquipContain()->GetItem(HEQUIP_CAP)); Msg.setCapGemID(uGemID); } if(pDest->GetEquipID(HEQUIP_ARMOR)>0) { Msg.setArmourID(pDest->GetEquipID(HEQUIP_ARMOR)); UINT uGemID = GetEquipmentMaxLevelGemID(pDest->GetEquipContain()->GetItem(HEQUIP_ARMOR)); Msg.setArmourGemID(uGemID); } pGamePlayer->SendPacket( &Msg ) ; } g_pLog->FastSaveLog( LOG_FILE_1, "CGCharAskEquipmentHandler: ok obj=%d scene=%d", ObjID, pScene->SceneID() ) ; return PACKET_EXE_CONTINUE ; __LEAVE_FUNCTION return PACKET_EXE_ERROR ; }
uint CGDiscardEquipHandler::Execute(CGDiscardEquip* 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 ) ; HUMAN_EQUIP EquipPoint = (HUMAN_EQUIP)pPacket->GetEquipPoint(); //Assert( pHuman->GetDB()->GetEquipDB()->IsSet(EquipPoint)) ; Item* pEquip = HumanItemLogic::GetEquip(pHuman,EquipPoint); if(!pEquip) { Assert(pEquip); return PACKET_EXE_CONTINUE; } GCDiscardEquipResult Msg; if(pEquip->IsEmpty()) { Msg.SetResult(DISCARDEQUIP_NO_SUCH_EQUIP); } if(pEquip->IsRuler(IRL_DISCARD)) { Msg.SetItemTableIndex(pEquip->GetItemTableIndex()); ITEM_LOG_PARAM ItemLogParam; ItemLogParam.OpType = ITEM_DISCARD_EQUIP; ItemLogParam.CharGUID = pHuman->GetGUID(); ItemLogParam.BagPos = EquipPoint; ItemLogParam.XPos = pHuman->getWorldPos()->m_fX; ItemLogParam.ZPos = pHuman->getWorldPos()->m_fZ; ItemLogParam.SceneID = pHuman->getScene()->SceneID(); BOOL bRet = g_ItemOperator.EraseItem(pHuman->GetEquipContain(),EquipPoint); if(bRet) SaveItemLog(&ItemLogParam); pHuman->SetEquipVer(pHuman->GetEquipVer()+1); pHuman->ItemEffectFlush(); Msg.SetResult(DISCARDEQUIP_SUCCESS); Msg.SetEquipPoint(EquipPoint); //如果可见 if(pHuman->IsVisualPart(EquipPoint)) { GCCharEquipment OtherMsg; OtherMsg.setObjID(pHuman->GetID()); OtherMsg.setID(EquipPoint,-1, -1); pScene->BroadCast(&OtherMsg,pHuman,TRUE); } } else { Msg.SetResult(DISCARDEQUIP_CANNT_DISCARD); } pGamePlayer->SendPacket(&Msg); g_pLog->FastSaveLog( LOG_FILE_1, "CGDiscardEquipHandler: ok EquipPoint=%d", EquipPoint ) ; return PACKET_EXE_CONTINUE; __LEAVE_FUNCTION return PACKET_EXE_ERROR; }
UINT CGUseEquipHandler::Execute(CGUseEquip* 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 ) ; //切场景时丢弃换装消息 if(pGamePlayer->GetPlayerStatus()!=PS_SERVER_NORMAL || !pHuman->IsActiveObj() ) { g_pLog->FastSaveLog( LOG_FILE_1, "CGUseEquipmentHandler: change scene") ; return PACKET_EXE_CONTINUE; } BYTE BagIndex = pPacket->getBagIndex(); if( BagIndex == INVALID_BAG_INDEX ) { Assert(FALSE) ; //包发错了 return PACKET_EXE_CONTINUE ; } Item* pUseItem = HumanItemLogic::GetItem(pHuman,BagIndex); GCUseEquipResult Msg; ////////////////////////////////////////////////////////////////////////// //装配条件判断 UCHAR itemClass = pUseItem->GetItemClass(); if(itemClass == ICLASS_EQUIP) { //需求等级判断 if(pUseItem->GetRequireLevel()>pHuman->GetLevel()) { Msg.setResult(USEEQUIP_IDENT_FAIL); pGamePlayer->SendPacket( &Msg ) ; } //鉴定判断 else if(pUseItem->GetItemQual() == EQUALITY_BLUE && pUseItem->GetItemIdent() == FALSE) { Msg.setResult(USEEQUIP_LEVEL_FAIL); pGamePlayer->SendPacket( &Msg ) ; } else { HUMAN_EQUIP Equip_Point =(HUMAN_EQUIP)pUseItem->GetEquipPoint(); //const _ITEM* pEquip = pHuman->GetEquip(Equip_Point); ItemContainer* pEquipContainer = pHuman->GetEquipContain(); if(!pEquipContainer) { Assert(pEquipContainer); return PACKET_EXE_CONTINUE; } Item* pEquipItem = pEquipContainer->GetItem((UINT)Equip_Point); if(!pEquipItem) { Assert(pEquipItem); return PACKET_EXE_CONTINUE; } BOOL bEquipStatus = (!pEquipItem->IsEmpty()); ItemContainer* pBagContainer = HumanItemLogic::GetContainer(pHuman,BagIndex); if(bEquipStatus) { //装备上物品,替换下来装备点数据 g_ItemOperator.ExchangeItem(pBagContainer, pBagContainer->BagIndex2ConIndex(BagIndex), pEquipContainer, (UINT)Equip_Point); } else { //pHuman->GetDB()->OverWriteBag2Equip(BagIndex,Equip_Point); g_ItemOperator.MoveItem(pBagContainer, pBagContainer->BagIndex2ConIndex(BagIndex), pEquipContainer, (UINT)Equip_Point); } Item* pEquip = pEquipContainer->GetItem((UINT)Equip_Point); if(pEquip&&pEquip->IsCanEquipBind()) { g_ItemOperator.SetItemBind(pEquipContainer,(UINT)Equip_Point); } Msg.setBagIndex(BagIndex); Msg.setEquipPoint(Equip_Point); Msg.setEquipID(pEquipItem->GetGUID()); Msg.setEquipResID(pEquipItem->GetItemTableIndex()); Msg.setItemResID(pUseItem->GetItemTableIndex()); Msg.setBagItemId(pUseItem->GetGUID()); Msg.setResult(USEEQUIP_SUCCESS); pGamePlayer->SendPacket( &Msg ) ; pHuman->SetEquipVer(pHuman->GetEquipVer()+1); //刷新装备对人物的属性影响 pHuman->ItemEffectFlush(); //如果可见 if(pHuman->IsVisualPart(Equip_Point)) { GCCharEquipment OtherMsg; OtherMsg.setObjID(pHuman->GetID()); if(Equip_Point == HEQUIP_WEAPON) { UINT uGemID = GetEquipmentMaxLevelGemID(pEquip); OtherMsg.setID(Equip_Point,pEquip->GetItemTableIndex(), uGemID); } else { OtherMsg.setID(Equip_Point,pEquip->GetItemTableIndex(), -1); } pScene->BroadCast(&OtherMsg,pHuman,TRUE); } WORD RetPart = 0; GCDetailEquipList SelfMsg; SelfMsg.setObjID( pHuman->GetID() ); pEquipItem = HumanItemLogic::GetEquip(pHuman,Equip_Point); if(!pEquipItem) { Assert(FALSE); return PACKET_EXE_CONTINUE; } if(pEquipItem->IsEmpty()) { g_pLog->FastSaveLog( LOG_FILE_1, "CGUseEquipmentHandler: Equip_Point =%d Fail", Equip_Point ) ; return PACKET_EXE_CONTINUE; } pEquipItem->SaveValueTo(SelfMsg.GetEquipData(Equip_Point)); RetPart|=(1<<((INT)Equip_Point)); SelfMsg.SetAskPart(RetPart); pGamePlayer->SendPacket( &SelfMsg ) ; } } else { Msg.setResult(USEEQUIP_TYPE_FAIL); Msg.setBagIndex(0); Msg.setEquipPoint(0); pGamePlayer->SendPacket( &Msg ) ; } g_pLog->FastSaveLog( LOG_FILE_1, "CGUseEquipmentHandler: BagIndex=%d", BagIndex ) ; return PACKET_EXE_CONTINUE ; __LEAVE_FUNCTION return PACKET_EXE_ERROR ; }
VOID Obj_Human::SendMsg_RefeshAttrib( VOID ) { __ENTER_FUNCTION INT nAttr = 0; BOOL bPublicAttrModified, bEquipmentModified, bDetailAttrModified; bPublicAttrModified = FALSE; bEquipmentModified = FALSE; bDetailAttrModified = FALSE; GCCharBaseAttrib msgPublicAttr; GCCharEquipment msgEquipment; GCDetailAttrib msgDetail; msgPublicAttr.setObjID( GetID() ); msgDetail.SetObjID( GetID() ); if ( m_AttrBackUp.m_bNameModified ) { bPublicAttrModified = TRUE; msgPublicAttr.setName( GetName() ); m_AttrBackUp.m_bNameModified = FALSE; } if ( m_AttrBackUp.m_bTitleModified ) { bPublicAttrModified = TRUE; msgPublicAttr.setTitle( GetTitle() ); msgPublicAttr.setTitleType( GetTitleType() ); m_AttrBackUp.m_bTitleModified = FALSE; } if(m_AttrBackUp.m_MaxHp != GetMaxHP()) { bPublicAttrModified = TRUE; m_AttrBackUp.m_MaxHp = GetMaxHP(); BYTE yHPPercent = (GetMaxHP())?((BYTE)((GetHP()*100 + GetMaxHP() - 1)/GetMaxHP())):(0); msgPublicAttr.setHPPercent( yHPPercent ); msgDetail.SetMAXHP( GetMaxHP() ); } if(m_AttrBackUp.m_HP != GetHP()) { bPublicAttrModified = TRUE; m_AttrBackUp.m_HP = GetHP(); BYTE yHPPercent = (GetMaxHP())?((BYTE)((GetHP()*100 + GetMaxHP() - 1)/GetMaxHP())):(0); msgPublicAttr.setHPPercent( yHPPercent ); msgDetail.SetHP( GetHP() ); } if(m_AttrBackUp.m_MaxMp != GetMaxMP()) { bPublicAttrModified = TRUE; m_AttrBackUp.m_MaxMp = GetMaxMP(); BYTE yMPPercent = (GetMaxMP())?((BYTE)((GetMP()*100 + GetMaxMP() - 1)/GetMaxMP())):(0); msgPublicAttr.setMPPercent( yMPPercent ); msgDetail.SetMAXMP( GetMaxMP() ); } if(m_AttrBackUp.m_MP != GetMP()) { bPublicAttrModified = TRUE; m_AttrBackUp.m_MP = GetMP(); BYTE yMPPercent = (GetMaxMP())?((BYTE)((GetMP()*100 + GetMaxMP() - 1)/GetMaxMP())):(0); msgPublicAttr.setMPPercent( yMPPercent ); msgDetail.SetMP( GetMP() ); } if(m_AttrBackUp.m_nRage != GetRage()) { bPublicAttrModified = TRUE; m_AttrBackUp.m_nRage = GetRage(); msgPublicAttr.setRage( GetRage() ); msgDetail.SetRage( GetRage() ); } if(fabs(m_AttrBackUp.m_MoveSpeed-GetMoveSpeed()) > 0.001f) { bPublicAttrModified = TRUE; m_AttrBackUp.m_MoveSpeed = GetMoveSpeed(); msgPublicAttr.setMoveSpeed( GetMoveSpeed() ); msgDetail.SetMoveSpeed( GetMoveSpeed() ); } const _CAMP_DATA *pCampData = GetCampData(); if ( pCampData != NULL ) { if(m_AttrBackUp.m_CampData != *pCampData) { bPublicAttrModified = TRUE; m_AttrBackUp.m_CampData = *pCampData; msgPublicAttr.setCampData( pCampData ); msgDetail.SetCampData( pCampData ); } } //if( m_AttrBackUp.m_nCampType != m_nCampType ) //{ // bPublicAttrModified = TRUE; // m_AttrBackUp.m_nCampType = m_nCampType; // msgPublicAttr.setCampType( m_nCampType ); // msgDetail.SetCampType( m_nCampType ); //} if(m_AttrBackUp.m_nOwnerID != GetOwnerID()) { bPublicAttrModified = TRUE; m_AttrBackUp.m_nOwnerID = GetOwnerID(); msgPublicAttr.setOwnerID( GetOwnerID() ); //msgDetail.SetOwnerID( GetOwnerID() ); } if(m_AttrBackUp.m_guidCurrentPet != GetCurrentPetGUID()) { bDetailAttrModified = TRUE; m_AttrBackUp.m_guidCurrentPet = GetCurrentPetGUID(); msgDetail.SetCurrentPetGUID( GetCurrentPetGUID() ); } if(m_AttrBackUp.m_RMBMoney != GetRMB()) { bDetailAttrModified = TRUE; m_AttrBackUp.m_RMBMoney = GetRMB() ; msgDetail.SetRMB( GetRMB() ) ; } if(m_AttrBackUp.m_BankRMB != GetBankRMB()) { bDetailAttrModified = TRUE; m_AttrBackUp.m_BankRMB = GetBankRMB() ; msgDetail.SetBankRMB( GetBankRMB() ) ; } if(m_AttrBackUp.m_DoubleExpTime_Num != GetDoubleExpTime_Num()) { bDetailAttrModified = TRUE; m_AttrBackUp.m_DoubleExpTime_Num = GetDoubleExpTime_Num() ; msgDetail.SetDoubleExpTime_Num( GetDoubleExpTime_Num() ) ; } /*if(m_AttrBackUp.m_GmRight != GetGmRight()) { bDetailAttrModified = TRUE; m_AttrBackUp.m_GmRight = GetGmRight() ; msgDetail.SetGmRight( GetGmRight() ) ; }*/ if(m_AttrBackUp.m_nDataID != GetDataID()) { bPublicAttrModified = TRUE; m_AttrBackUp.m_nDataID = GetDataID(); msgPublicAttr.setDataID( GetDataID() ); msgDetail.SetDataID( GetDataID() ); } if(m_AttrBackUp.m_nPortraitID != GetPortraitID()) { bPublicAttrModified = TRUE; m_AttrBackUp.m_nPortraitID = GetPortraitID(); msgPublicAttr.setPortraitID( GetPortraitID() ); msgDetail.SetPortraitID( GetPortraitID() ); } if(m_AttrBackUp.m_nModelID != GetModelID()) { bPublicAttrModified = TRUE; m_AttrBackUp.m_nModelID = GetModelID(); msgPublicAttr.setModelID( GetModelID() ); msgDetail.SetModelID( GetModelID() ); } if(m_AttrBackUp.m_nMountID != GetMountID()) { bPublicAttrModified = TRUE; m_AttrBackUp.m_nMountID = GetMountID(); msgPublicAttr.setMountID( GetMountID() ); msgDetail.SetMountID( GetMountID() ); } if(m_AttrBackUp.m_uHairMeshID != __GetHairModel() || m_AttrBackUp.m_uHairColor != __GetHairColor() || m_AttrBackUp.m_uFaceMeshID != __GetFaceModel()) { bPublicAttrModified = TRUE; m_AttrBackUp.m_uHairMeshID = __GetHairModel(); m_AttrBackUp.m_uFaceMeshID = __GetFaceModel(); m_AttrBackUp.m_uHairColor = __GetHairColor(); msgPublicAttr.setFaceMeshID( __GetFaceModel() ); msgPublicAttr.setHairMeshID( __GetHairModel() ); msgPublicAttr.setHairMatrixID( __GetHairColor() ); } if(m_AttrBackUp.m_nStealthLevel != GetStealthLevel()) { bPublicAttrModified = TRUE; m_AttrBackUp.m_nStealthLevel = GetStealthLevel(); msgPublicAttr.setStealthLevel( GetStealthLevel() ); } if(m_AttrBackUp.m_nMoodState != GetMoodState()) { bPublicAttrModified = TRUE; m_AttrBackUp.m_nMoodState = GetMoodState(); msgPublicAttr.setMoodState( GetMoodState() ); } if(m_AttrBackUp.m_Level != GetLevel()) { bPublicAttrModified = TRUE; m_AttrBackUp.m_Level = GetLevel(); msgPublicAttr.setLevel( GetLevel() ); msgDetail.SetLevel( GetLevel() ); } if ( m_AttrBackUp.m_bStallIsOpen != m_StallBox.GetStallIsOpen() ) {//摊位状态发生变化 bPublicAttrModified = TRUE; m_AttrBackUp.m_bStallIsOpen = m_StallBox.GetStallIsOpen(); msgPublicAttr.setIsOpen(m_AttrBackUp.m_bStallIsOpen); } if ( m_AttrBackUp.m_bStallNameChanged ) {//摊位名发生变化 m_AttrBackUp.m_bStallNameChanged = FALSE; if(m_StallBox.GetStallIsOpen()) { bPublicAttrModified = TRUE; msgPublicAttr.setStallName( m_StallBox.GetStallName() ); } } if(m_AttrBackUp.m_bLimitMove != IsLimitMove()) { bDetailAttrModified = TRUE; m_AttrBackUp.m_bLimitMove = IsLimitMove(); //msgPublicAttr.SetLimitMove( IsLimitMove() ); //msgPublicAttrAndLevel.SetLimitMove( IsLimitMove() ); //msgProtectedAttr.SetLimitMove( IsLimitMove() ); msgDetail.SetLimitMove( IsLimitMove() ); } if(m_AttrBackUp.m_bCanActionFlag1 != CanActionFlag1()) { bDetailAttrModified = TRUE; m_AttrBackUp.m_bCanActionFlag1 = CanActionFlag1(); msgDetail.SetCanActionFlag1(CanActionFlag1()); } if(m_AttrBackUp.m_bCanActionFlag2 != CanActionFlag2()) { bDetailAttrModified = TRUE; m_AttrBackUp.m_bCanActionFlag2 = CanActionFlag2(); msgDetail.SetCanActionFlag2(CanActionFlag1()); } if(m_AttrBackUp.m_Exp != GetExp()) { bDetailAttrModified = TRUE; m_AttrBackUp.m_Exp = GetExp(); msgDetail.SetExp( GetExp() ); } if(m_AttrBackUp.m_Money != GetMoney()) { bDetailAttrModified = TRUE; m_AttrBackUp.m_Money = GetMoney(); msgDetail.SetMoney( GetMoney() ); } if(m_AttrBackUp.m_RMBMoney != GetRMB()) { bDetailAttrModified = TRUE; m_AttrBackUp.m_RMBMoney = GetRMB(); msgDetail.SetRMB( GetRMB() ); } if(m_AttrBackUp.m_nMenpai != GetMenPai()) { bDetailAttrModified = TRUE; m_AttrBackUp.m_nMenpai = GetMenPai(); msgDetail.SetMenpai(GetMenPai()); } if(m_AttrBackUp.m_GuildID != GetGuildID()) { bDetailAttrModified = TRUE; m_AttrBackUp.m_GuildID = GetGuildID(); msgDetail.SetGuild(GetGuildID()); } if(m_AttrBackUp.m_nStr != GetStr()) { bDetailAttrModified = TRUE; m_AttrBackUp.m_nStr = GetStr(); msgDetail.SetStr(GetStr()); } if(m_AttrBackUp.m_nSpr != GetSpr()) { bDetailAttrModified = TRUE; m_AttrBackUp.m_nSpr = GetSpr(); msgDetail.SetSpr(GetSpr()); } if(m_AttrBackUp.m_nCon != GetCon()) { bDetailAttrModified = TRUE; m_AttrBackUp.m_nCon = GetCon(); msgDetail.SetCon(GetCon()); } if(m_AttrBackUp.m_nInt != GetInt()) { bDetailAttrModified = TRUE; m_AttrBackUp.m_nInt = GetInt(); msgDetail.SetInt(GetInt()); } if(m_AttrBackUp.m_nDex != GetDex()) { bDetailAttrModified = TRUE; m_AttrBackUp.m_nDex = GetDex(); msgDetail.SetDex(GetDex()); } if(m_AttrBackUp.m_nPointRemain != Get_RemainPoints()) { bDetailAttrModified = TRUE; m_AttrBackUp.m_nPointRemain = Get_RemainPoints(); msgDetail.SetPoint_Remain( Get_RemainPoints() ); } if(m_AttrBackUp.m_nReHpSpeed != GetHPRegenerate()) { bDetailAttrModified = TRUE; m_AttrBackUp.m_nReHpSpeed = GetHPRegenerate(); msgDetail.SetHP_ReSpeed( GetHPRegenerate() ); } if(m_AttrBackUp.m_nReMpSpeed != GetMPRegenerate()) { bDetailAttrModified = TRUE; m_AttrBackUp.m_nReMpSpeed = GetMPRegenerate(); msgDetail.SetMP_ReSpeed( GetMPRegenerate() ); } nAttr = Attr_VerifyGeneralAttack(GetAttackPhysics()); if(m_AttrBackUp.m_nAttPhysics != nAttr) { bDetailAttrModified = TRUE; m_AttrBackUp.m_nAttPhysics = nAttr; msgDetail.SetAtt_Physics(nAttr); } nAttr = Attr_VerifyGeneralAttack(GetAttackMagic()); if(m_AttrBackUp.m_nAttMagic != nAttr) { bDetailAttrModified = TRUE; m_AttrBackUp.m_nAttMagic = nAttr; msgDetail.SetAtt_Magic(nAttr); } nAttr = Attr_VerifyDefence(GetDefencePhysics()); if(m_AttrBackUp.m_nDefPhysics != nAttr) { bDetailAttrModified = TRUE; m_AttrBackUp.m_nDefPhysics = nAttr; msgDetail.SetDef_Physics(nAttr); } nAttr = Attr_VerifyDefence(GetDefenceMagic()); if(m_AttrBackUp.m_nDefMagic != nAttr) { bDetailAttrModified = TRUE; m_AttrBackUp.m_nDefMagic = nAttr; msgDetail.SetDef_Magic(nAttr); } nAttr = Attr_VerifyHitMiss(GetHit()); if(m_AttrBackUp.m_nHit != nAttr) { bDetailAttrModified = TRUE; m_AttrBackUp.m_nHit = nAttr; msgDetail.SetHit(nAttr); } nAttr = Attr_VerifyHitMiss(GetMiss()); if(m_AttrBackUp.m_nMiss != nAttr) { bDetailAttrModified = TRUE; m_AttrBackUp.m_nMiss = nAttr; msgDetail.SetMiss(nAttr); } nAttr = Attr_VerifyCritical(GetCritical()); if(m_AttrBackUp.m_nCritic != nAttr) { bDetailAttrModified = TRUE; m_AttrBackUp.m_nCritic = nAttr; msgDetail.SetCritic(nAttr); } if(m_AttrBackUp.m_nStrikePoint != GetStrikePoint()) { bDetailAttrModified = TRUE; m_AttrBackUp.m_nStrikePoint = GetStrikePoint(); msgDetail.SetStrikePoint( GetStrikePoint() ); } if(m_AttrBackUp.m_nAttSpeed != GetAttackSpeed()) { bDetailAttrModified = TRUE; m_AttrBackUp.m_nAttSpeed = GetAttackSpeed(); msgDetail.SetAttSpeed( GetAttackSpeed() ); } nAttr = Attr_VerifyTraitAttack(GetAttackCold()); if(m_AttrBackUp.m_nAttCold != nAttr) { bDetailAttrModified = TRUE; m_AttrBackUp.m_nAttCold = nAttr; msgDetail.SetAttCold(nAttr); } nAttr = Attr_VerifyResist(GetDefenceCold()); if(m_AttrBackUp.m_nDefCold != nAttr) { bDetailAttrModified = TRUE; m_AttrBackUp.m_nDefCold = nAttr; msgDetail.SetDefCold(nAttr); } nAttr = Attr_VerifyTraitAttack(GetAttackFire()); if(m_AttrBackUp.m_nAttFire != nAttr) { bDetailAttrModified = TRUE; m_AttrBackUp.m_nAttFire = nAttr; msgDetail.SetAttFire(nAttr); } nAttr = Attr_VerifyResist(GetDefenceFire()); if(m_AttrBackUp.m_nDefFire != nAttr) { bDetailAttrModified = TRUE; m_AttrBackUp.m_nDefFire = nAttr; msgDetail.SetDefFire(nAttr); } nAttr = Attr_VerifyTraitAttack(GetAttackLight()); if(m_AttrBackUp.m_nAttLight != nAttr) { bDetailAttrModified = TRUE; m_AttrBackUp.m_nAttLight = nAttr; msgDetail.SetAttLight(nAttr); } nAttr = Attr_VerifyResist(GetDefenceLight()); if(m_AttrBackUp.m_nDefLight != nAttr) { bDetailAttrModified = TRUE; m_AttrBackUp.m_nDefLight = nAttr; msgDetail.SetDefLight(nAttr); } nAttr = Attr_VerifyTraitAttack(GetAttackPoison()); if(m_AttrBackUp.m_nAttPoison != nAttr) { bDetailAttrModified = TRUE; m_AttrBackUp.m_nAttPoison = nAttr; msgDetail.SetAttPoison(nAttr); } nAttr = Attr_VerifyResist(GetDefencePoison()); if(m_AttrBackUp.m_nDefPoison != nAttr) { bDetailAttrModified = TRUE; m_AttrBackUp.m_nDefPoison = nAttr; msgDetail.SetDefPoison(nAttr); } // 装备刷新 if ( m_AttrBackUp.m_bWeaponModified ) { bEquipmentModified = TRUE; msgEquipment.setWeaponID( GetEquipID( HEQUIP_WEAPON ) ); Item *pWeaponItem = GetEquipContain()->GetItem(HEQUIP_WEAPON); UINT uGemID = INVALID_ID; if(pWeaponItem != NULL) { uGemID = GetEquipmentMaxLevelGemID(pWeaponItem); } msgEquipment.setWeaponGemID(uGemID); m_AttrBackUp.m_bWeaponModified = FALSE; } if ( m_AttrBackUp.m_bCapModified ) { bEquipmentModified = TRUE; msgEquipment.setCapID( GetEquipID( HEQUIP_CAP ) ); Item *pCapItem = GetEquipContain()->GetItem(HEQUIP_CAP); UINT uGemID = INVALID_ID; if(pCapItem != NULL) { uGemID = GetEquipmentMaxLevelGemID(pCapItem); } msgEquipment.setCapGemID( uGemID ); m_AttrBackUp.m_bCapModified = FALSE; } if ( m_AttrBackUp.m_bArmorModified ) { bEquipmentModified = TRUE; msgEquipment.setArmourID( GetEquipID( HEQUIP_ARMOR ) ); Item *pArmorItem = GetEquipContain()->GetItem(HEQUIP_ARMOR); UINT uGemID = INVALID_ID; if(pArmorItem != NULL) { uGemID = GetEquipmentMaxLevelGemID(pArmorItem); } msgEquipment.setArmourGemID( uGemID ); m_AttrBackUp.m_bArmorModified = FALSE; } if ( m_AttrBackUp.m_bCuffModified ) { bEquipmentModified = TRUE; msgEquipment.setCuffID( GetEquipID( HEQUIP_CUFF ) ); Item *pCuffItem = GetEquipContain()->GetItem(HEQUIP_CUFF); UINT uGemID = INVALID_ID; if(pCuffItem != NULL) { uGemID = GetEquipmentMaxLevelGemID(pCuffItem); } msgEquipment.setCuffGemID( uGemID ); m_AttrBackUp.m_bCuffModified = FALSE; } if ( m_AttrBackUp.m_bBootModified ) { bEquipmentModified = TRUE; msgEquipment.setBootID( GetEquipID( HEQUIP_BOOT ) ); Item *pBootItem = GetEquipContain()->GetItem(HEQUIP_BOOT); UINT uGemID = INVALID_ID; if(pBootItem != NULL) { uGemID = GetEquipmentMaxLevelGemID(pBootItem); } msgEquipment.setBootGemID( uGemID ); m_AttrBackUp.m_bBootModified = FALSE; } if ( m_AttrBackUp.m_bSashModified ) { bEquipmentModified = TRUE; //msgEquipment.setSashID( GetEquipID( HEQUIP_SASH ) ); m_AttrBackUp.m_bSashModified = FALSE; } if ( bPublicAttrModified ) { if ( bPublicAttrModified ) { m_PublicAttrVersion++; } if ( bEquipmentModified ) { m_EquipVer++; } HUMANLIST listHuman; getScene()->ScanHuman( getZoneID(), MAX_REFESH_OBJ_ZONE_RADIUS, &(listHuman) ); BOOL bSendPublicMsg = bPublicAttrModified; BYTE i; for ( i = 0; i < listHuman.m_Count; i++ ) { Obj_Human *pTargetHuman = listHuman.m_aHuman[i]; if ( IsCanViewMe( pTargetHuman ) ) { pTargetHuman->GetPlayer()->SendPacket( &msgPublicAttr ); if ( bEquipmentModified ) { pTargetHuman->GetPlayer()->SendPacket( &msgEquipment ); } } } } bDetailAttrModified |= bPublicAttrModified; if ( bDetailAttrModified ) { GetPlayer()->SendPacket(&msgDetail); //发送给自己的详细消息 } __LEAVE_FUNCTION }