cgadditemtoitemhandler.cpp
来自「dk1游戏的原代码文件,完整.编译系统redhat7.3,mysql 3.23 」· C++ 代码 · 共 1,320 行 · 第 1/3 页
CPP
1,320 行
//////////////////////////////////////////////////////////////////////////////// Filename : CGAddItemToItemHandler.cc// Written By : elca@ewestsoft.com// Description :///////////////////////////////////////////////////////////////////////////////*// 茄 酒捞袍阑 甸绢辑 促弗 酒捞袍俊 持绰促. [Client] [Server] -- CGAddItemToItem (mouseItem_ObjectID, invenX, invenY) =(付快胶俊 甸绊乐绰 喊, upgrade且 item XY) --> <-- GCAddItemToItemVerify(搬苞内靛, 包访蔼) --- //-------------+---------------------------------------------// 荤侩 packet | client 贸府//-------------+---------------------------------------------// 阂啊 packet | 阂啊 message 免仿// 角菩 packet | 角菩 message 免仿, 喊 昏力, [酒捞袍 力芭]// 己傍 packet | 喊 昏力, option函版//-------------+---------------------------------------------*/#include "CGAddItemToItem.h"#ifdef __GAME_SERVER__ #include <stdio.h> #include "GamePlayer.h" #include "PlayerCreature.h" #include "Inventory.h" #include "Item.h" #include "ItemInfoManager.h" #include "OptionInfo.h" #include "ItemUtil.h" #include "EventStar.h" #include "PetItem.h" #include "PetEnchantItem.h" #include "PetInfo.h" #include "PetAttrInfo.h" #include "PetTypeInfo.h" #include "CreatureUtil.h" #include "MixingItem.h" #include "PacketUtil.h" #include "Gpackets/GCAddItemToItemVerify.h" #include "Gpackets/GCDeleteInventoryItem.h" #include "Gpackets/GCCreateItem.h" #include "SystemAvailabilitiesManager.h" void executeEnchantOption(GamePlayer* pGamePlayer, Item* pMouseItem, Item* pItem, CoordInven_t invenX, CoordInven_t invenY) throw(Error); void executeEnchantRareOption(GamePlayer* pGamePlayer, Item* pMouseItem, Item* pItem, CoordInven_t invenX, CoordInven_t invenY) throw(Error); void executeAddOption(GamePlayer* pGamePlayer, Item* pMouseItem, Item* pItem, OptionType_t addOptionType) throw(Error); void executeTransKit(GamePlayer* pGamePlayer, Item* pMouseItem, Item* pItem) throw(Error); extern bool isPossibleOptionItemClass(Item::ItemClass IClass); OptionInfo* getOptionInfo(OptionType_t optionType); void processUpgradeOptionType(Item* pItem, OptionType_t currentOptionType, OptionInfo* pOptionInfo) throw (Error); void crashItem(Item* pItem, Inventory* pInventory, CoordInven_t invenX, CoordInven_t invenY) throw (Error); void downgradeOptionType(Item* pItem, OptionType_t currentOptionType, OptionInfo* pOptionInfo) throw (Error); void sendEnchantImpossible(GamePlayer* pGamePlayer) throw (Error); void sendEnchantOK(GamePlayer* pGamePlayer, DWORD optionChange) throw (Error);#endif // __GAME_SERVER__////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////void CGAddItemToItemHandler::execute (CGAddItemToItem* pPacket , Player* pPlayer) throw (Error){ __BEGIN_TRY __BEGIN_DEBUG_EX #ifdef __GAME_SERVER__ Assert(pPacket != NULL); Assert(pPlayer != NULL); //cout << pPacket->toString().c_str() << endl; GamePlayer* pGamePlayer = dynamic_cast<GamePlayer*>(pPlayer); Assert(pGamePlayer != NULL); // by sigi if (pGamePlayer->getPlayerStatus() == GPS_NORMAL) { SYSTEM_ASSERT( SYSTEM_ENCHANT ); Creature* pCreature = pGamePlayer->getCreature(); PlayerCreature* pPC = dynamic_cast<PlayerCreature*>(pCreature); ObjectID_t objectID = pPacket->getObjectID(); Inventory* pInventory = pPC->getInventory(); CoordInven_t invenX = pPacket->getX(); CoordInven_t invenY = pPacket->getY(); // 牢亥配府俊 酒捞袍捞 绝阑锭(谅钎眉农档 窍霸 等促.) if (!pInventory->hasItem(invenX, invenY)) { GCAddItemToItemVerify gcAddItemToItemVerify; gcAddItemToItemVerify.setCode( ADD_ITEM_TO_ITEM_VERIFY_ERROR ); pGamePlayer->sendPacket( &gcAddItemToItemVerify ); return; } // 付快胶 酒捞袍 Item* pMouseItem = pPC->getExtraInventorySlotItem(); // 牢亥配府俊 乐绰 酒捞袍 Item* pItem = pInventory->getItem(invenX, invenY); // 酒捞袍捞 绝芭唱 // objectID啊 肋给等 版快 if (pMouseItem==NULL || pItem==NULL || pMouseItem->getObjectID()!=objectID || pMouseItem->getNum() != 1 ) { //cout << "Wrong Item" << endl; GCAddItemToItemVerify gcAddItemToItemVerify; gcAddItemToItemVerify.setCode( ADD_ITEM_TO_ITEM_VERIFY_ERROR ); pGamePlayer->sendPacket( &gcAddItemToItemVerify ); return; } switch (pMouseItem->getItemClass()) { //--------------------------------------------------------- // // ITEM_CLASS_EVENT_STAR // //--------------------------------------------------------- // 酒捞袍狼 可记阑 upgrade 矫挪促. //--------------------------------------------------------- case Item::ITEM_CLASS_EVENT_STAR : { ItemInfo* pItemInfo = g_pEventStarInfoManager->getItemInfo( pMouseItem->getItemType() ); Assert(pItemInfo!=NULL); EventStarInfo* pEventStarInfo = dynamic_cast<EventStarInfo*>(pItemInfo); Assert(pEventStarInfo!=NULL); int optionSize = pItem->getOptionTypeSize(); if (pEventStarInfo->isFunctionTransKit()) { executeTransKit(pGamePlayer, pMouseItem, pItem); } // Enchant Option else if (optionSize>1) // by sigi. 2002.10.21 { if (pEventStarInfo->isFunctionEnchantRareOption()) { executeEnchantRareOption(pGamePlayer, pMouseItem, pItem, invenX, invenY); } else { GCAddItemToItemVerify gcAddItemToItemVerify; gcAddItemToItemVerify.setCode( ADD_ITEM_TO_ITEM_VERIFY_ENCHANT_IMPOSSIBLE ); pGamePlayer->sendPacket( &gcAddItemToItemVerify ); return; } } else if (pEventStarInfo->isFunctionEnchantOption()) { executeEnchantOption(pGamePlayer, pMouseItem, pItem, invenX, invenY); } // Add Option else if (pEventStarInfo->isFunctionAddOption()) { int addOptionType = pEventStarInfo->getFunctionValue(); executeAddOption(pGamePlayer, pMouseItem, pItem, addOptionType); } } break; case Item::ITEM_CLASS_PET_ENCHANT_ITEM : { //cout << "Trying Pet Enchant... " << endl; if ( pItem->getItemClass() != Item::ITEM_CLASS_PET_ITEM ) { //cout << "脐 酒捞袍俊促啊 茄霸 酒丛促." << endl; GCAddItemToItemVerify gcAddItemToItemVerify; gcAddItemToItemVerify.setCode( ADD_ITEM_TO_ITEM_VERIFY_ERROR ); pGamePlayer->sendPacket( &gcAddItemToItemVerify ); return; } PetEnchantItemInfo* pItemInfo = dynamic_cast<PetEnchantItemInfo*>(g_pPetEnchantItemInfoManager->getItemInfo( pMouseItem->getItemType() )); Assert( pItemInfo != NULL ); PetItem* pPetItem = dynamic_cast<PetItem*>(pItem); PetInfo* pPetInfo = NULL; if ( pPetItem == NULL || ( pPetInfo = pPetItem->getPetInfo() ) == NULL ) { //cout << "脐 酒捞袍捞 酒聪芭唱 脐 酒捞袍俊 脐 惑怕啊 绝嚼聪促." << endl; GCAddItemToItemVerify gcAddItemToItemVerify; gcAddItemToItemVerify.setCode( ADD_ITEM_TO_ITEM_VERIFY_ERROR ); pGamePlayer->sendPacket( &gcAddItemToItemVerify ); return; } /* ENCHANT_FUNCTION = 0, SPEC_OPTION_FUNCTION = 1, REVIVAL_FUNCTION = 13, RARE_FUNCTION = 14 */ switch ( pItemInfo->getFunction() ) { case PetEnchantItemInfo::ENCHANT_FUNCTION : { if ( pPetInfo->getPetAttr() != 0xff ) { //cout << "捞固 牢忙飘等 酒捞袍涝聪促." << endl; GCAddItemToItemVerify gcAddItemToItemVerify; gcAddItemToItemVerify.setCode( ADD_ITEM_TO_ITEM_VERIFY_ERROR ); pGamePlayer->sendPacket( &gcAddItemToItemVerify ); return; } //cout << "钎霖 牢忙飘 矫档吝涝聪促." << endl; pPC->deleteItemFromExtraInventorySlot(); pMouseItem->destroy(); SAFE_DELETE( pMouseItem ); if ( PetAttrInfoManager::Instance().enchantRandomAttr( pPetInfo, pItemInfo->getFunctionGrade() ) ) { //cout << "牢忙飘 己傍." << endl; pPetItem->savePetInfo(); GCAddItemToItemVerify gcAddItemToItemVerify; gcAddItemToItemVerify.setCode( ADD_ITEM_TO_ITEM_VERIFY_ENCHANT_OK ); gcAddItemToItemVerify.setParameter( ((uint)pPetInfo->getPetAttr())<<16 | (uint)pPetInfo->getPetAttrLevel() ); pGamePlayer->sendPacket( &gcAddItemToItemVerify ); if ( pPC->getPetInfo() == pPetInfo ) { //cout << "捞固 阂矾廉乐绢辑 菩哦 焊郴绰 吝涝聪促." << endl; sendPetInfo( pGamePlayer, true ); pPC->initAllStatAndSend(); } return; } else { //cout << "牢忙飘 角菩" << endl; GCAddItemToItemVerify gcAddItemToItemVerify; gcAddItemToItemVerify.setCode( ADD_ITEM_TO_ITEM_VERIFY_ENCHANT_FAIL ); pGamePlayer->sendPacket( &gcAddItemToItemVerify ); return; } } break; case PetEnchantItemInfo::SPEC_OPTION_FUNCTION : { if ( pPetInfo->getPetAttr() != 0xff ) { //cout << "捞固 牢忙飘等 酒捞袍涝聪促." << endl; GCAddItemToItemVerify gcAddItemToItemVerify; gcAddItemToItemVerify.setCode( ADD_ITEM_TO_ITEM_VERIFY_ERROR ); pGamePlayer->sendPacket( &gcAddItemToItemVerify ); return; } pPC->deleteItemFromExtraInventorySlot(); pMouseItem->destroy(); SAFE_DELETE( pMouseItem ); if ( PetAttrInfoManager::Instance().enchantSpecAttr( pPetInfo, (PetAttr_t)pItemInfo->getFunctionGrade() ) ) { pPetItem->savePetInfo(); GCAddItemToItemVerify gcAddItemToItemVerify; gcAddItemToItemVerify.setCode( ADD_ITEM_TO_ITEM_VERIFY_ENCHANT_OK ); gcAddItemToItemVerify.setParameter( ((uint)pPetInfo->getPetAttr())<<16 | (uint)pPetInfo->getPetAttrLevel() );// gcAddItemToItemVerify.setParameter( pPetInfo->getPetAttr() ); pGamePlayer->sendPacket( &gcAddItemToItemVerify ); if ( pPC->getPetInfo() == pPetInfo ) { sendPetInfo( pGamePlayer, true ); pPC->initAllStatAndSend(); } return; } else { GCAddItemToItemVerify gcAddItemToItemVerify; gcAddItemToItemVerify.setCode( ADD_ITEM_TO_ITEM_VERIFY_ENCHANT_FAIL ); pGamePlayer->sendPacket( &gcAddItemToItemVerify ); return; } } break; case PetEnchantItemInfo::RARE_FUNCTION: { //cout << "脐 饭绢 牢忙飘 吝涝聪促." << endl; if ( pPetInfo->getPetLevel() != 49 ) { //cout << "饭骇档 救等 逞 牢忙飘窍瘤 付祭" << endl; GCAddItemToItemVerify gcAddItemToItemVerify; gcAddItemToItemVerify.setCode( ADD_ITEM_TO_ITEM_VERIFY_ERROR ); pGamePlayer->sendPacket( &gcAddItemToItemVerify ); return; } pPC->deleteItemFromExtraInventorySlot(); pMouseItem->destroy(); SAFE_DELETE( pMouseItem ); /* OptionType_t targetOption = rand()%87; targetOption++; */ OptionType_t targetOption = 0; int ratio = rand() % 100000; const list<PetEnchantOption*>& petEnchantOptions = g_pOptionInfoManager->getPetEnchantOptionList(); list<PetEnchantOption*>::const_iterator itr = petEnchantOptions.begin(); list<PetEnchantOption*>::const_iterator endItr = petEnchantOptions.end(); for ( ; itr != endItr ; itr++ ) { PetEnchantOption* pPetEnchantOption = *itr; if ( pPetEnchantOption->getRatio() > ratio ) { targetOption = pPetEnchantOption->getOptionType(); break; } } pPetInfo->setPetOption( targetOption ); sendPetInfo( pGamePlayer ); GCAddItemToItemVerify gcAddItemToItemVerify; gcAddItemToItemVerify.setCode( ADD_ITEM_TO_ITEM_VERIFY_ENCHANT_OK ); gcAddItemToItemVerify.setParameter( targetOption ); pGamePlayer->sendPacket( &gcAddItemToItemVerify ); char query[100]; sprintf(query, "PetOption=%u", (uint)targetOption); pItem->tinysave(query); } break; case PetEnchantItemInfo::REVIVAL_FUNCTION: { //cout << "何劝 矫档吝 涝聪促." << endl; if ( pPetInfo->getPetHP() != 0 ) { //cout << "救 磷篮 局 何劝矫虐瘤 付祭" << endl; GCAddItemToItemVerify gcAddItemToItemVerify; gcAddItemToItemVerify.setCode( ADD_ITEM_TO_ITEM_VERIFY_ERROR ); pGamePlayer->sendPacket( &gcAddItemToItemVerify ); return; } pPC->deleteItemFromExtraInventorySlot(); pMouseItem->destroy(); SAFE_DELETE( pMouseItem ); VSDateTime current = VSDateTime::currentDateTime(); int Days = pPetInfo->getLastFeedTime().daysTo(current); if ( Days < 0 ) Days = 0; if ( pItemInfo->getItemType() != 14 ) { int value = rand()%100; if ( Days >= 8 || value >= (10-Days/2)*10 ) { GCAddItemToItemVerify gcAddItemToItemVerify; gcAddItemToItemVerify.setCode( ADD_ITEM_TO_ITEM_VERIFY_ENCHANT_FAIL ); pGamePlayer->sendPacket( &gcAddItemToItemVerify ); return; } } pPetInfo->setPetHP( pItemInfo->getFunctionGrade() ); pPetInfo->setFeedTime( VSDateTime::currentDateTime() ); pPetInfo->getPetItem()->savePetInfo(); GCAddItemToItemVerify gcAddItemToItemVerify; gcAddItemToItemVerify.setCode( ADD_ITEM_TO_ITEM_VERIFY_REVIVAL_OK ); gcAddItemToItemVerify.setParameter( pPetInfo->getPetHP() ); pGamePlayer->sendPacket( &gcAddItemToItemVerify ); } break; case PetEnchantItemInfo::MUTANT_FUNCTION: { if ( pPetInfo->getPetType() != 1 ) { cout << "匡橇刀捞 酒聪而聪促." << endl; GCAddItemToItemVerify gcAddItemToItemVerify; gcAddItemToItemVerify.setCode( ADD_ITEM_TO_ITEM_VERIFY_ERROR ); pGamePlayer->sendPacket( &gcAddItemToItemVerify ); return; } bool summonPet = pPC->getPetInfo() == pPetInfo; pPC->deleteItemFromExtraInventorySlot(); pMouseItem->destroy(); SAFE_DELETE( pMouseItem ); PetTypeInfo* pPetTypeInfo = PetTypeInfoManager::getInstance()->getPetTypeInfo(2); Assert( pPetTypeInfo != NULL ); pPetInfo->setPetType(2); pPetInfo->setPetCreatureType( pPetTypeInfo->getPetCreatureType( pPetInfo->getPetLevel() ) ); pPetItem->setItemType(2); pPetItem->tinysave( "ItemType=2" );// if ( pPC->getPetInfo() == pPetInfo ) sendPetInfo( pGamePlayer ); if ( summonPet ) { pPC->setPetInfo( NULL ); sendPetInfo( pGamePlayer ); } GCAddItemToItemVerify gcAddItemToItemVerify; gcAddItemToItemVerify.setCode( ADD_ITEM_TO_ITEM_VERIFY_ENCHANT_OK ); gcAddItemToItemVerify.setParameter( 0 ); pGamePlayer->sendPacket( &gcAddItemToItemVerify ); GCDeleteInventoryItem gcDI; gcDI.setObjectID( pPetItem->getObjectID() ); pGamePlayer->sendPacket( &gcDI ); CoordInven_t X = -1, Y; pPC->getInventory()->findItemOID( pPetItem->getObjectID(), X, Y ); Assert( X != -1 ); GCCreateItem gcCI; makeGCCreateItem( &gcCI, pPetItem, X, Y );
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?