📄 actiontradelairitem.cpp
字号:
////////////////////////////////////////////////////////////////////////////////// Filename : ActionTradeLairItem.cpp// Written By : 厘全芒// Description :// 饭绢 付胶磐甫 磷看阑 版快 积扁绰 酒捞袍阑// NPC客 背券窍绰 肺流捞促.// 积己登绰 酒捞袍篮 Random窍霸 搬沥等促. ( 捞 版快 Gameble阑// 肋 捞侩窍搁 浆匡 淀 窍促)//// // History.//// Date Writer Description// ---------- ----------- ------------------------------------------------------// 2002.09.04 厘全芒 脚痹 积己////////////////////////////////////////////////////////////////////////////////#include "ActionTradeLairItem.h"#include "PlayerCreature.h"#include "GamePlayer.h"#include "Item.h"#include "ItemUtil.h"#include "Inventory.h"#include "Zone.h"#include "ItemFactoryManager.h"#include "DB.h"#include "Thread.h"#include "Treasure.h"#include "Slayer.h"#include "Vampire.h"#include "Ousters.h"#include "MonsterInfo.h"#include "QuestItem.h"#include "ItemUtil.h"#include "StringPool.h"#include "ItemMineInfo.h"#include "PacketUtil.h"#include "ItemGradeManager.h"#include <list>#include "Gpackets/GCCreateItem.h"#include "Gpackets/GCNPCResponse.h"#include "Gpackets/GCSystemMessage.h"#include "Gpackets/GCDeleteInventoryItem.h"#include "SystemAvailabilitiesManager.h"////////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////void ActionTradeLairItem::read(PropertyBuffer & propertyBuffer) throw (Error){ __BEGIN_TRY try { // 罐阑 捣狼 剧阑 佬绢甸牢促. m_Type = (ItemType_t)propertyBuffer.getPropertyInt("Type"); } catch (NoSuchElementException & nsee) { throw Error(nsee.toString()); } __END_CATCH}////////////////////////////////////////////////////////////////////////////////// 咀记阑 角青茄促.////////////////////////////////////////////////////////////////////////////////void ActionTradeLairItem::execute(Creature * pCreature1 , Creature * pCreature2) throw (Error){ __BEGIN_TRY Assert(pCreature1 != NULL); Assert(pCreature2 != NULL); Assert(pCreature1->isNPC()); Assert(pCreature2->isPC()); if ( m_Type <= 5 ) { SYSTEM_RETURN_IF_NOT( SYSTEM_MASTER_LAIR ); } PlayerCreature* pPC = dynamic_cast<PlayerCreature*>(pCreature2); Assert(pPC != NULL); Player* pPlayer = pPC->getPlayer(); Assert(pPlayer != NULL); GCNPCResponse okpkt; pPlayer->sendPacket(&okpkt); StringStream message; /* GCSystemMessage gcSystemMessage; gcSystemMessage.setMessage("酒流 瘤盔登瘤 臼绰 扁瓷涝聪促"); pPlayer->sendPacket(&gcSystemMessage); */ //cout << "ActionTradeLairItem" << ":" << m_Type; Inventory* pInventory = pPC->getInventory(); // 刚历 酒捞袍阑 啊瘤绊 乐绰啊甫 眉农茄促. Item* pMasterItem = NULL; MonsterType_t MonsterType = 0; Item* pItem1 = NULL; // 可记俊 蝶扼辑 促弗 酒捞袍阑 八荤秦具 茄促. // 内抄 : 埔带飘/ 厚陵父 眉农茄促. // 宏府妮扼墨胶: 抛其令 奇带飘/厚陵父 眉农秦具 茄促 // 墨烙 : 官配府 埔带飘/厚陵父 眉农秦具 茄促. if (m_Type == 0) // 内抄, 厚陵 { pMasterItem = pInventory->findItem(Item::ITEM_CLASS_QUEST_ITEM, 0); MonsterType = BATORI_TYPE; if ( pMasterItem == NULL ) { pMasterItem = pInventory->findItem(Item::ITEM_CLASS_QUEST_ITEM, 2); MonsterType = TEPEZ_TYPE; } } else if (m_Type == 1) // 内抄, 埔带飘 { pMasterItem = pInventory->findItem(Item::ITEM_CLASS_QUEST_ITEM, 1); MonsterType = BATORI_TYPE; if (pMasterItem == NULL) { pMasterItem = pInventory->findItem(Item::ITEM_CLASS_QUEST_ITEM, 3); MonsterType = TEPEZ_TYPE; } } else if (m_Type == 2) // 宏府妮扼墨胶, 厚陵 { pMasterItem = pInventory->findItem(Item::ITEM_CLASS_QUEST_ITEM, 2); MonsterType = TEPEZ_TYPE; } else if (m_Type == 3) // 宏府妮扼墨胶, 埔带飘 { pMasterItem = pInventory->findItem(Item::ITEM_CLASS_QUEST_ITEM, 3); MonsterType = TEPEZ_TYPE; } else if (m_Type == 4) // 墨烙, 厚陵 { pMasterItem = pInventory->findItem(Item::ITEM_CLASS_QUEST_ITEM, 0); MonsterType = BATORI_TYPE; } else if (m_Type == 5) // 墨烙, 埔带飘 { pMasterItem = pInventory->findItem(Item::ITEM_CLASS_QUEST_ITEM, 1); MonsterType = BATORI_TYPE; } else if (m_Type == 6) // 联胶沛捞瘤氛~ { pMasterItem = pInventory->findItem(Item::ITEM_CLASS_QUEST_ITEM, 4); MonsterType = BATORI_TYPE; } else if (m_Type == 7) // 焊抚崔~ { pMasterItem = pInventory->findItem(Item::ITEM_CLASS_QUEST_ITEM, 5); ItemMineInfo* pItemMineInfo; if ( pPC->isSlayer() ) { Slayer* pSlayer = dynamic_cast<Slayer*>(pPC); Assert( pSlayer != NULL ); Attr_t totalAttr = pSlayer->getTotalAttr(ATTR_BASIC); if ( totalAttr <= 130 ) // 窍靛内爹 ぬ.ば pItemMineInfo = g_pItemMineInfoManager->getItemMineInfo( 0 ); else if ( totalAttr <= 210 ) pItemMineInfo = g_pItemMineInfoManager->getItemMineInfo( 1 ); else if ( totalAttr <= 270 ) pItemMineInfo = g_pItemMineInfoManager->getItemMineInfo( 2 ); else if ( totalAttr <= 300 ) pItemMineInfo = g_pItemMineInfoManager->getItemMineInfo( 3 ); else pItemMineInfo = g_pItemMineInfoManager->getItemMineInfo( 4 ); } else if ( pPC->isVampire() ) { Vampire* pVampire = dynamic_cast<Vampire*>(pPC); Assert( pVampire != NULL ); Level_t level = pVampire->getLevel(); if ( level <= 20 ) pItemMineInfo = g_pItemMineInfoManager->getItemMineInfo( 5 ); else if ( level <= 40 ) pItemMineInfo = g_pItemMineInfoManager->getItemMineInfo( 6 ); else if ( level <= 60 ) pItemMineInfo = g_pItemMineInfoManager->getItemMineInfo( 7 ); else if ( level <= 90 ) pItemMineInfo = g_pItemMineInfoManager->getItemMineInfo( 8 ); else pItemMineInfo = g_pItemMineInfoManager->getItemMineInfo( 9 ); } else if ( pPC->isOusters() ) { Ousters* pOusters = dynamic_cast<Ousters*>(pPC); Assert( pOusters != NULL ); Level_t level = pOusters->getLevel(); if ( level <= 20 ) pItemMineInfo = g_pItemMineInfoManager->getItemMineInfo( 10 ); else if ( level <= 40 ) pItemMineInfo = g_pItemMineInfoManager->getItemMineInfo( 11 ); else if ( level <= 60 ) pItemMineInfo = g_pItemMineInfoManager->getItemMineInfo( 12 ); else if ( level <= 90 ) pItemMineInfo = g_pItemMineInfoManager->getItemMineInfo( 13 ); else pItemMineInfo = g_pItemMineInfoManager->getItemMineInfo( 14 ); } else Assert(false); pItem1 = pItemMineInfo->getItem(); setItemGender( pItem1, (pPC->getSex()==FEMALE)?GENDER_FEMALE:GENDER_MALE ); } else if (m_Type == 8) // 弊故崔~ { pMasterItem = pInventory->findItem(Item::ITEM_CLASS_QUEST_ITEM, 6); if ( pPC->isSlayer() ) { pItem1 = g_pItemMineInfoManager->getRandomItem( 15, 32 ); } else if ( pPC->isVampire() ) { pItem1 = g_pItemMineInfoManager->getRandomItem( 33, 45 ); } else if ( pPC->isOusters() ) { pItem1 = g_pItemMineInfoManager->getRandomItem( 46, 61 ); } setItemGender( pItem1, (pPC->getSex()==FEMALE)?GENDER_FEMALE:GENDER_MALE ); } else if (m_Type == 9) // 弧埃祸 汗林赣聪 { pMasterItem = pInventory->findItem(Item::ITEM_CLASS_QUEST_ITEM, 7); if ( pPC->isSlayer() ) { pItem1 = g_pItemMineInfoManager->getRandomItem( 62, 81 ); } else if ( pPC->isVampire() ) { pItem1 = g_pItemMineInfoManager->getRandomItem( 82, 96 ); } else if ( pPC->isOusters() ) { pItem1 = g_pItemMineInfoManager->getRandomItem( 97, 112); } } else { // 芭贰甫 困茄 NPC狼 Property啊 肋给登菌促. 捞繁 版快俊绰 // 款康评栏肺 巩狼甫 窍搁 官肺 贸府甫 且 荐 乐促. GCSystemMessage gcSystemMessage; gcSystemMessage.setMessage( g_pStringPool->getString( STRID_NPC_ERROR ) ); pPlayer->sendPacket(&gcSystemMessage); GCNPCResponse response; response.setCode(NPC_RESPONSE_QUIT_DIALOGUE); pPlayer->sendPacket(&response); return; } if (pMasterItem == NULL) { GCSystemMessage gcSystemMessage; gcSystemMessage.setMessage( g_pStringPool->getString( STRID_NO_LAIR_ITEM ) ); pPlayer->sendPacket(&gcSystemMessage); GCNPCResponse response; response.setCode(NPC_RESPONSE_QUIT_DIALOGUE); pPlayer->sendPacket(&response); return; } Zone* pZone = pPC->getZone();// if ( MonsterType != 0 ) // 风泼钎甫 曼炼秦辑 酒捞袍阑 父甸绢坷绰 版快 if ( pItem1 == NULL ) { QuestItemInfo* pItemInfo = dynamic_cast<QuestItemInfo*>(g_pQuestItemInfoManager->getItemInfo( pMasterItem->getItemType() )); Assert(pItemInfo!=NULL); /////////////////////////////////////////////////////////////////////////////// // 啊厘 抄皑茄 何盒 // 酒捞袍阑 罚待窍霸 急琶秦具 茄促. // 老窜篮 扁夯 酒捞袍 窍唱肺 茄促. ////////////////////////////////////////////////////////////////////////////// const MonsterInfo* pMonsterInfo = g_pMonsterInfoManager->getMonsterInfo(MonsterType); TreasureList *pTreasureList = NULL; // 辆练俊 蝶扼辑 林绰 酒捞袍档 崔扼具 茄促. if (pCreature2->isSlayer()) pTreasureList = pMonsterInfo->getSlayerTreasureList(); else if (pCreature2->isVampire()) pTreasureList = pMonsterInfo->getVampireTreasureList(); else if (pCreature2->isOusters()) pTreasureList = pMonsterInfo->getOustersTreasureList(); const list<Treasure*>& treasures = pTreasureList->getTreasures(); list<Treasure*>::const_iterator itr = treasures.begin(); ITEM_TEMPLATE it; for(; itr != treasures.end(); itr++) { Treasure* pTreasure = (*itr); it.ItemClass = Item::ITEM_CLASS_MAX; it.ItemType = 0; // QuestItem 付促 促弗.. 可记捞 2俺 嘿阑 犬伏 it.NextOptionRatio = pItemInfo->getBonusRatio(); //cout << "TradeLairItem: BonusRatio = " << it.NextOptionRatio << endl; if ( pTreasure->getRandomItem(&it) ) { pItem1 = g_pItemFactoryManager->createItem(it.ItemClass, it.ItemType, it.OptionType); Assert(pItem1 != NULL); } } if (pItem1 == NULL) { StringStream msg; msg << "ActionTradeLairItem: " << (int)it.ItemClass << ", " << (int)it.ItemType << ", " << (int)it.bCreateOption << ", " << getOptionTypeToString(it.OptionType); filelog("tradeLairItemBUG.txt", "%s", msg.toString().c_str()); GCSystemMessage gcSystemMessage; gcSystemMessage.setMessage( g_pStringPool->getString( STRID_ITEM_CREATE_ERROR ) ); pPlayer->sendPacket(&gcSystemMessage); GCNPCResponse response; response.setCode(NPC_RESPONSE_QUIT_DIALOGUE); pPlayer->sendPacket(&response); return; } } TPOINT pt; pItem1->setGrade( min(7,ItemGradeManager::Instance().getRandomBeadGrade()) ); pZone->registerObject(pItem1); // 父距 inventory俊 傍埃捞 乐促搁, 持绰促. if(pInventory->addItem(pItem1, pt)) { pItem1->create(pPC->getName(), STORAGE_INVENTORY, 0, pt.x, pt.y); GCCreateItem gcCreateItem;/* gcCreateItem.setObjectID(pItem1->getObjectID()); gcCreateItem.setItemClass(pItem1->getItemClass()); gcCreateItem.setItemType(pItem1->getItemType()); gcCreateItem.setOptionType(pItem1->getOptionTypeList()); gcCreateItem.setDurability(pItem1->getDurability()); gcCreateItem.setItemNum(pItem1->getNum()); gcCreateItem.setInvenX(pt.x); gcCreateItem.setInvenY(pt.y); gcCreateItem.setGrade( pItem1->getGrade() );*/ makeGCCreateItem( &gcCreateItem, pItem1, pt.x, pt.y ); pPlayer->sendPacket(&gcCreateItem); // ItemTraceLog 甫 巢变促 if ( pItem1 != NULL && pItem1->isTraceItem() ) { remainTraceLog( pItem1, pCreature1->getName(), pCreature2->getName(), ITEM_LOG_CREATE, DETAIL_EVENTNPC); } // 扁粮狼 酒捞袍阑 绝矩促 GCDeleteInventoryItem gcDeleteInventoryItem; gcDeleteInventoryItem.setObjectID(pMasterItem->getObjectID()); pPlayer->sendPacket(&gcDeleteInventoryItem); // 辑滚俊辑 绝局霖促. pInventory->deleteItem(pMasterItem->getObjectID()); // 谅钎肺 官层林搁 亮阑扒单.. // ItemTraceLog 甫 巢变促 if ( pMasterItem != NULL && pMasterItem->isTraceItem() ) { remainTraceLog( pMasterItem, pCreature2->getName(), pCreature1->getName(), ITEM_LOG_DELETE, DETAIL_EVENTNPC); } pMasterItem->destroy(); SAFE_DELETE(pMasterItem); // 荤侩磊俊霸 己傍 皋矫瘤 免仿// StringStream message;// message << "己傍利栏肺 背券登菌嚼聪促"; GCSystemMessage gcSystemMessage; gcSystemMessage.setMessage( g_pStringPool->getString( STRID_TRADE_SUCCESS ) ); pPlayer->sendPacket(&gcSystemMessage); } else {// StringStream buf;// buf << "牢亥配府俊 傍埃捞 何练钦聪促"; GCSystemMessage gcSystemMessage; gcSystemMessage.setMessage( g_pStringPool->getString( STRID_NOT_ENOUGH_INVENTORY_SPACE ) ); pPlayer->sendPacket(&gcSystemMessage); } GCNPCResponse response; response.setCode(NPC_RESPONSE_QUIT_DIALOGUE); pPlayer->sendPacket(&response); __END_CATCH}////////////////////////////////////////////////////////////////////////////////// get debug string////////////////////////////////////////////////////////////////////////////////string ActionTradeLairItem::toString () const throw (){ __BEGIN_TRY StringStream msg; msg << "ActionTradeLairItem(" << ")"; return msg.toString(); __END_CATCH}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -