ORESULT AbilityInlay::OnProcOver(Obj_Human* pHuman) { __ENTER_FUNCTION Assert( pHuman ); ORESULT res; res = CanUseAbility(pHuman); // 以免过程中某些状态发生变化 if( res != OR_OK ) { return res; } AbilityOpera* pAbilityOpera; pAbilityOpera = pHuman->GetAbilityOpera(); Assert( pAbilityOpera ); BYTE GemBagIndex = pAbilityOpera->m_BagPos[0]; BYTE EquipBagIndex = pAbilityOpera->m_BagPos[1]; CHAR MaterialBagIndex1 = (CHAR)pAbilityOpera->m_BagPos[2]; CHAR MaterialBagIndex2 = (CHAR)pAbilityOpera->m_BagPos[3]; Item* pGemItem = HumanItemLogic::GetBagItem( pHuman, GemBagIndex ); Item* pEquipItem = HumanItemLogic::GetBagItem( pHuman, EquipBagIndex ); Item* pMaterialItem1 = NULL; Item* pMaterialItem2 = NULL; if( MaterialBagIndex1 != -1 ) { pMaterialItem1 = HumanItemLogic::GetBagItem( pHuman, MaterialBagIndex1 ); Assert(pMaterialItem1 != NULL); } if( MaterialBagIndex2 != -1 ) { pMaterialItem2 = HumanItemLogic::GetBagItem( pHuman, MaterialBagIndex2 ); Assert(pMaterialItem1 != NULL); } Assert( (pGemItem != NULL) && (pEquipItem != NULL) ); UINT GemIndex = pGemItem->GetItemTableIndex(); UINT EquipIndex = pEquipItem->GetItemTableIndex(); INT MaterialIndex1 = -1; INT MaterialIndex2 = -1; if( pMaterialItem1 ) { MaterialIndex1 = pMaterialItem1->GetItemTableIndex(); //if(pMaterialItem1) // pMaterialItem1->SetItemParam( 0, IPV_INT, INT( EquipBagIndex ) );//modi:lby20071114记录当前装备的id } if( pMaterialItem2 ) { MaterialIndex2 = pMaterialItem2->GetItemTableIndex(); //if(pMaterialItem2) //pMaterialItem2->SetItemParam( 0, IPV_INT, INT( EquipBagIndex ) );//modi:lby20071114记录当前装备的id } if( (pGemItem->IsLock()) || (pEquipItem->IsLock()) || (pGemItem->IsPWLock()) || (pEquipItem->IsPWLock()) ) { // 这里判断是否锁定,下面消耗时就不再判断了 return OR_STUFF_LACK; } if( pMaterialItem1 ) { if( pMaterialItem1->IsLock() || pMaterialItem1->IsPWLock() ) return OR_STUFF_LACK; } if( pMaterialItem2 ) { if( pMaterialItem2->IsLock() || pMaterialItem2->IsPWLock() ) return OR_STUFF_LACK; } EmbedResult flag; LuaInterface* pLuaInterface; pLuaInterface = pHuman->getScene()->GetLuaInterface(); // 脚本判断是否镶嵌成功,如果成功则主动加上熟练度 // 否则返回失败情况 flag = (EmbedResult)pLuaInterface->ExeScript_DDDDDD(ABILITY_LOGIC_SCRIPT, DEF_GEM_EMBED_PROCESS, (INT)pHuman->getScene()->SceneID(), (INT)pHuman->GetID(), (INT)EquipBagIndex, (INT)GemIndex, (INT)MaterialIndex1, (INT)MaterialIndex2 ) ; GCDiscardItemResult Msg; Msg.setResult( DISCARDITEM_SUCCESS ); GamePlayer* pGamePlayer = (GamePlayer*)(pHuman->GetPlayer()); ITEM_LOG_PARAM ItemLogParam; ItemLogParam.OpType = ITEM_INLAY_LOST; BOOL bRet = FALSE; switch(flag) { case EMBED_SUCCESS: { if( MaterialIndex1 != -1 ) { bRet = HumanItemLogic::EraseBagItem(&ItemLogParam,pHuman,MaterialBagIndex1); if(bRet) SaveItemLog(&ItemLogParam); } if( MaterialIndex2 != -1 ) { bRet = HumanItemLogic::EraseBagItem(&ItemLogParam,pHuman,MaterialBagIndex2); if(bRet) SaveItemLog(&ItemLogParam); } INT nRet ;//= pHuman->UseGem(GemBagIndex, EquipBagIndex); if(USEGEM_SUCCESS == nRet) { g_ImpactCore.SendImpactToUnit(*pHuman, 49, pHuman->GetID()); } return OnProcSuccess(pHuman); } case GEM_GONE: if( MaterialIndex1 != -1 ) { bRet = HumanItemLogic::EraseBagItem(&ItemLogParam,pHuman,GemBagIndex); if(bRet) SaveItemLog(&ItemLogParam); } if( MaterialIndex2 != -1 ) { bRet = HumanItemLogic::EraseBagItem(&ItemLogParam,pHuman,MaterialBagIndex2); if(bRet) SaveItemLog(&ItemLogParam); } bRet = HumanItemLogic::EraseBagItem(&ItemLogParam,pHuman,GemBagIndex); if(bRet) SaveItemLog(&ItemLogParam); Msg.setItemTableIndex( GemIndex ); Msg.setBagIndex( GemBagIndex ); pGamePlayer->SendPacket( &Msg ); return OR_FAILURE; case EQUIP_GONE: if( MaterialIndex1 != -1 ) { bRet = HumanItemLogic::EraseBagItem(&ItemLogParam,pHuman,EquipBagIndex); if(bRet) SaveItemLog(&ItemLogParam); } if( MaterialIndex2 != -1 ) { bRet = HumanItemLogic::EraseBagItem(&ItemLogParam,pHuman,MaterialBagIndex2); if(bRet) SaveItemLog(&ItemLogParam); } bRet = HumanItemLogic::EraseBagItem(&ItemLogParam,pHuman,EquipBagIndex); if(bRet) SaveItemLog(&ItemLogParam); Msg.setItemTableIndex( EquipIndex ); Msg.setBagIndex( EquipBagIndex ); pGamePlayer->SendPacket( &Msg ); return OR_FAILURE; case BOTH_GONE: if( MaterialIndex1 != -1 ) { bRet = HumanItemLogic::EraseBagItem(&ItemLogParam,pHuman,EquipBagIndex); if(bRet) SaveItemLog(&ItemLogParam); } if( MaterialIndex2 != -1 ) { bRet = HumanItemLogic::EraseBagItem(&ItemLogParam,pHuman,GemBagIndex); if(bRet) SaveItemLog(&ItemLogParam); } bRet = HumanItemLogic::EraseBagItem(&ItemLogParam,pHuman,EquipBagIndex); if(bRet) SaveItemLog(&ItemLogParam); bRet = HumanItemLogic::EraseBagItem(&ItemLogParam,pHuman,GemBagIndex); if(bRet) SaveItemLog(&ItemLogParam); Msg.setItemTableIndex( GemIndex ); Msg.setBagIndex( GemBagIndex ); pGamePlayer->SendPacket( &Msg ); Msg.setItemTableIndex( EquipIndex ); Msg.setBagIndex( EquipBagIndex ); pGamePlayer->SendPacket( &Msg ); return OR_FAILURE; case ENERGY_NOT_ENOUGH: return OR_NOT_ENOUGH_ENERGY; case GEM_DEGRADE_1: { if( MaterialIndex1 != -1 ) { bRet = HumanItemLogic::EraseBagItem(&ItemLogParam,pHuman,MaterialBagIndex1); if(bRet) SaveItemLog(&ItemLogParam); } if( MaterialIndex2 != -1 ) { bRet = HumanItemLogic::EraseBagItem(&ItemLogParam,pHuman,MaterialBagIndex2); if(bRet) SaveItemLog(&ItemLogParam); } bRet = HumanItemLogic::EraseBagItem(&ItemLogParam,pHuman,GemBagIndex); if(bRet) SaveItemLog(&ItemLogParam); _ITEM_TYPE type = ConvertSerial2ItemType(GemIndex); /* if(type.m_Quality>1) { type.m_Quality--; ITEM_LOG_PARAM ItemLogParam; ItemLogParam.OpType = ITEM_CREATE_REMOVE_GEM; ItemLogParam.CharGUID = pHuman->GetGUID(); ItemLogParam.SceneID = pHuman->getScene()->SceneID(); ItemLogParam.XPos = pHuman->getWorldPos()->m_fX; ItemLogParam.ZPos = pHuman->getWorldPos()->m_fZ; UINT GemBagIndex_Temp = GemBagIndex; HumanItemLogic::CreateItemToBag(&ItemLogParam,pHuman,type.ToSerial(),GemBagIndex_Temp,ITEM_DROP_MONSTER); }*/ Msg.setItemTableIndex( GemIndex ); Msg.setBagIndex( GemBagIndex ); pGamePlayer->SendPacket( &Msg ); } return OR_FAILURE; case GEM_DEGRADE_2: { if( MaterialIndex1 != -1 ) { bRet = HumanItemLogic::EraseBagItem(&ItemLogParam,pHuman,MaterialBagIndex1); if(bRet) SaveItemLog(&ItemLogParam); } if( MaterialIndex2 != -1 ) { bRet = HumanItemLogic::EraseBagItem(&ItemLogParam,pHuman,MaterialBagIndex2); if(bRet) SaveItemLog(&ItemLogParam); } bRet = HumanItemLogic::EraseBagItem(&ItemLogParam,pHuman,GemBagIndex); if(bRet) SaveItemLog(&ItemLogParam); _ITEM_TYPE type = ConvertSerial2ItemType(GemIndex); /*if(type.m_Quality>2) { type.m_Quality -= 2; ITEM_LOG_PARAM ItemLogParam; ItemLogParam.OpType = ITEM_CREATE_REMOVE_GEM; ItemLogParam.CharGUID = pHuman->GetGUID(); ItemLogParam.SceneID = pHuman->getScene()->SceneID(); ItemLogParam.XPos = pHuman->getWorldPos()->m_fX; ItemLogParam.ZPos = pHuman->getWorldPos()->m_fZ; UINT GemBagIndex_Temp = GemBagIndex; HumanItemLogic::CreateItemToBag(&ItemLogParam,pHuman,type.ToSerial(),GemBagIndex_Temp,ITEM_DROP_MONSTER); }*/ Msg.setItemTableIndex( GemIndex ); Msg.setBagIndex( GemBagIndex ); pGamePlayer->SendPacket( &Msg ); } return OR_FAILURE; case GEM_DEGRADE_3: { if( MaterialIndex1 != -1 ) { bRet = HumanItemLogic::EraseBagItem(&ItemLogParam,pHuman,MaterialBagIndex1); if(bRet) SaveItemLog(&ItemLogParam); } if( MaterialIndex2 != -1 ) { bRet = HumanItemLogic::EraseBagItem(&ItemLogParam,pHuman,MaterialBagIndex2); if(bRet) SaveItemLog(&ItemLogParam); } bRet = HumanItemLogic::EraseBagItem(&ItemLogParam,pHuman,GemBagIndex); if(bRet) SaveItemLog(&ItemLogParam); _ITEM_TYPE type = ConvertSerial2ItemType(GemIndex); /*if(type.m_Quality>3) { type.m_Quality -= 3; ITEM_LOG_PARAM ItemLogParam; ItemLogParam.OpType = ITEM_CREATE_REMOVE_GEM; ItemLogParam.CharGUID = pHuman->GetGUID(); ItemLogParam.SceneID = pHuman->getScene()->SceneID(); ItemLogParam.XPos = pHuman->getWorldPos()->m_fX; ItemLogParam.ZPos = pHuman->getWorldPos()->m_fZ; UINT GemBagIndex_Temp = GemBagIndex; HumanItemLogic::CreateItemToBag(&ItemLogParam,pHuman,type.ToSerial(),GemBagIndex_Temp,ITEM_DROP_MONSTER); }*/ Msg.setItemTableIndex( GemIndex ); Msg.setBagIndex( GemBagIndex ); pGamePlayer->SendPacket( &Msg ); } return OR_FAILURE; default: Assert(FALSE); return OR_ERROR; } __LEAVE_FUNCTION return OR_ERROR; }
ORESULT AbilityMachining::OnProcOver(Obj_Human* pHuman) { __ENTER_FUNCTION Assert( pHuman ); AbilityOpera* pAbilityOpera; pAbilityOpera = pHuman->GetAbilityOpera(); Assert( pAbilityOpera ); switch( pAbilityOpera->m_SubType ) { case NORMAL_TYPE: return AbilityCompound::OnProcOver(pHuman); case GEM_COMPOUND: { ORESULT res; BOOL flag = FALSE; LuaInterface* pLuaInterface; UINT itemIndex; res = CanUseAbility(pHuman); // 以免过程中某些状态发生变化 if( res != OR_OK ) { return res; } pLuaInterface = pHuman->getScene()->GetLuaInterface(); itemIndex = HumanItemLogic::GetBagItem(pHuman, pAbilityOpera->m_BagPos[0])->GetItemTableIndex(); // 不管成功失败,宝石是没有了 GCDiscardItemResult Msg; GamePlayer* pGamePlayer; pGamePlayer = (GamePlayer*)pHuman->GetPlayer(); Assert( pGamePlayer != NULL ); ITEM_LOG_PARAM ItemLogParam; ItemLogParam.OpType = ITEM_GEM_COMPOUND_LOST; BOOL bRet = HumanItemLogic::EraseBagItem(&ItemLogParam,pHuman,pAbilityOpera->m_BagPos[0]); if(bRet) { SaveItemLog(&ItemLogParam); } Msg.setItemTableIndex( itemIndex ); Msg.setResult( DISCARDITEM_SUCCESS ); Msg.setBagIndex( pAbilityOpera->m_BagPos[0] ); pGamePlayer->SendPacket( &Msg ); bRet = HumanItemLogic::EraseBagItem(&ItemLogParam,pHuman,pAbilityOpera->m_BagPos[1]); if(bRet) { SaveItemLog(&ItemLogParam); } Msg.setBagIndex( pAbilityOpera->m_BagPos[1] ); pGamePlayer->SendPacket( &Msg ); if( pLuaInterface->ExeScript_DDD( ABILITY_LOGIC_SCRIPT, "CompoundProc", (INT)pHuman->getScene()->SceneID(), (INT)pHuman->GetID(), (INT)itemIndex ) != FALSE ) // 这里显然需要调用 lua script { // 脚本判断是否合成成功,成功了自动增加熟练度 flag = TRUE; pAbilityOpera->m_uItemIndex = itemIndex; res = OnProcSuccess( pHuman ); } if( flag == TRUE ) { return res; } else { return OR_FAILURE; } } break; case GEM_EMBED: { ORESULT res; enum EmbedResult { EMBED_SUCCESS = 0, GEM_GONE, EQUIP_GONE, BOTH_GONE, }; EmbedResult flag; LuaInterface* pLuaInterface; BYTE GemBagIndex = pAbilityOpera->m_BagPos[0]; BYTE EquipBagIndex = pAbilityOpera->m_BagPos[1]; UINT GemIndex = HumanItemLogic::GetBagItem(pHuman,GemBagIndex)->GetItemTableIndex(); UINT EquipIndex = HumanItemLogic::GetBagItem(pHuman,EquipBagIndex)->GetItemTableIndex(); res = CanUseAbility(pHuman); // 以免过程中某些状态发生变化 if( res != OR_OK ) { return res; } pLuaInterface = pHuman->getScene()->GetLuaInterface(); // 脚本判断是否镶嵌成功,如果成功则主动加上熟练度 // 否则返回失败情况 flag = (EmbedResult)pLuaInterface->ExeScript_DDD( ABILITY_LOGIC_SCRIPT, "EmbedProc", (INT)pHuman->getScene()->SceneID(), (INT)pHuman->GetID(), (INT)GemIndex ) ; GCDiscardItemResult Msg; Msg.setResult( DISCARDITEM_SUCCESS ); GamePlayer* pGamePlayer = (GamePlayer*)(pHuman->GetPlayer()); ITEM_LOG_PARAM ItemLogParam; ItemLogParam.OpType = ITEM_MACHINE_LOST; BOOL bRet = FALSE; switch(flag) { case EMBED_SUCCESS: { INT nRet;// = pHuman->UseGem(GemBagIndex, EquipBagIndex); if(USEGEM_SUCCESS == nRet) { g_ImpactCore.SendImpactToUnit(*pHuman, 49, pHuman->GetID()); } } return OnProcSuccess(pHuman); case GEM_GONE: bRet = HumanItemLogic::EraseBagItem(&ItemLogParam,pHuman,GemBagIndex); if(bRet) SaveItemLog(&ItemLogParam); //pHuman->EraseItem(GemBagIndex); Msg.setItemTableIndex( GemIndex ); Msg.setBagIndex( GemBagIndex ); pGamePlayer->SendPacket( &Msg ); return OR_FAILURE; case EQUIP_GONE: bRet = HumanItemLogic::EraseBagItem(&ItemLogParam,pHuman,EquipBagIndex); if(bRet) SaveItemLog(&ItemLogParam); //pHuman->EraseItem(EquipBagIndex); Msg.setItemTableIndex( EquipIndex ); Msg.setBagIndex( EquipBagIndex ); pGamePlayer->SendPacket( &Msg ); return OR_FAILURE; case BOTH_GONE: bRet = HumanItemLogic::EraseBagItem(&ItemLogParam,pHuman,EquipBagIndex); if(bRet) SaveItemLog(&ItemLogParam); bRet = HumanItemLogic::EraseBagItem(&ItemLogParam,pHuman,GemBagIndex); if(bRet) SaveItemLog(&ItemLogParam); Msg.setItemTableIndex( GemIndex ); Msg.setBagIndex( GemBagIndex ); pGamePlayer->SendPacket( &Msg ); Msg.setItemTableIndex( EquipIndex ); Msg.setBagIndex( EquipBagIndex ); pGamePlayer->SendPacket( &Msg ); return OR_FAILURE; default: Assert(FALSE); return OR_ERROR; } } break; default: Assert(FALSE); return OR_ERROR; } return OR_WARNING; __LEAVE_FUNCTION return OR_ERROR; }
uint CGDiscardItemHandler::Execute(CGDiscardItem* 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(); BYTE BagIndex = pPacket->GetBagIndex(); Assert(BagIndex<MAX_BAG_SIZE); if(Opt == CGDiscardItem::FromBag) { Item* pBagItem = HumanItemLogic::GetItem(pHuman,BagIndex); Assert(pBagItem); if(pBagItem->IsEmpty()) { g_pLog->FastSaveLog( LOG_FILE_1, "CGDiscardItemHandler: ok BagIndex=%d occur null type ", BagIndex ) ; return PACKET_EXE_CONTINUE; } GCDiscardItemResult Msg; Msg.setItemTableIndex(pBagItem->GetItemTableIndex()); if(pBagItem->IsRuler(IRL_DISCARD)) { ITEM_LOG_PARAM ItemLogParam; ItemLogParam.OpType = ITEM_USEGEM_LOST; BOOL bRet = HumanItemLogic::EraseItem(&ItemLogParam,pHuman,BagIndex); if(bRet) { SaveItemLog(&ItemLogParam); } Msg.setResult(DISCARDITEM_SUCCESS); Msg.setBagIndex(BagIndex); } else { Msg.setResult(DISCARDITEM_FAIL); } pGamePlayer->SendPacket(&Msg); } else if(Opt == CGDiscardItem::FromBank) { Item* pBagItem = HumanItemLogic::GetBankItem(pHuman,BagIndex); Assert(pBagItem); if(pBagItem->IsEmpty()) { g_pLog->FastSaveLog( LOG_FILE_1, "CGDiscardItemHandler: ok BagIndex=%d occur null type ", BagIndex ) ; return PACKET_EXE_CONTINUE; } GCDiscardItemResult Msg; Msg.setItemTableIndex(pBagItem->GetItemTableIndex()); if(pBagItem->IsRuler(IRL_DISCARD)) { ITEM_LOG_PARAM ItemLogParam; ItemLogParam.OpType = ITEM_DISCARD_EQUIP; ItemLogParam.CharGUID = pHuman->GetGUID(); ItemLogParam.BagPos = BagIndex; ItemLogParam.XPos = pHuman->getWorldPos()->m_fX; ItemLogParam.ZPos = pHuman->getWorldPos()->m_fZ; ItemLogParam.SceneID = pHuman->getScene()->SceneID(); ItemContainer* pBankContainer = pHuman->GetBankContain(); if(g_ItemOperator.EraseItem(pBankContainer, BagIndex) == FALSE) { SaveItemLog(&ItemLogParam); g_pLog->FastSaveLog( LOG_FILE_1, "CGDiscardItemHandler: ok BagIndex=%d occur null type ", BagIndex ) ; return PACKET_EXE_CONTINUE; } Msg.setOpt(GCDiscardItemResult::FromBank); Msg.setResult(DISCARDITEM_SUCCESS); Msg.setBagIndex(BagIndex); } else { Msg.setResult(DISCARDITEM_FAIL); } pGamePlayer->SendPacket(&Msg); } g_pLog->FastSaveLog( LOG_FILE_1, "CGDiscardEquipHandler: ok BagIndex=%d", BagIndex ) ; return PACKET_EXE_CONTINUE; __LEAVE_FUNCTION return PACKET_EXE_ERROR; }