📄 playercreature.cpp
字号:
//////////////////////////////////////////////////////////////////////////////// Filename : PlayerCreature.cpp// Written by : excel96// Description : //////////////////////////////////////////////////////////////////////////////#include "PlayerCreature.h"#include "Stash.h"#include "DB.h"#include "StringStream.h"#include "Item.h"#include "ItemUtil.h"#include "Belt.h"#include "Inventory.h"#include "GoodsInventory.h"#include "Zone.h"#include "FlagSet.h"#include "ParkingCenter.h"#include "Key.h"#include "Guild.h"#include "GuildManager.h"#include "Gpackets/GCRankBonusInfo.h"#include "Gpackets/GCTimeLimitItemInfo.h"#include "Gpackets/GCModifyInformation.h"#include "Gpackets/GCOtherModifyInfo.h"#include "Gpackets/GCNoticeEvent.h"#include "Gpackets/GCMonsterKillQuestInfo.h"#include "Gpackets/GCPetStashList.h"#include "Player.h"#include "RankBonusInfo.h"#include "GamePlayer.h"#include "TimeLimitItemManager.h"#include "mission/QuestManager.h"#include "Properties.h"#include "PKZoneInfoManager.h"#include "RankExpTable.h"//#include "QuestManager.h"//#include "QuestEvent.h"//#include "Quest.h"//#include "SimpleQuestLoader.h"#include <list>#include "DefaultOptionSetInfo.h"#include "Pet.h"const int MAX_GOODS_INVENTORY_SIZE = 10;//////////////////////////////////////////////////////////////////////////////// constructor//////////////////////////////////////////////////////////////////////////////PlayerCreature::PlayerCreature(ObjectID_t OID, Player* pPlayer) throw(): Creature(OID, pPlayer){ __BEGIN_TRY m_pInventory = new Inventory(10, 6); m_pExtraInventorySlot = new InventorySlot(); m_pGoodsInventory = new GoodsInventory(); m_pStash = new Stash; m_StashNum = 0; m_StashGold = 0; m_bStashStatus = false; m_pFlagSet = new FlagSet; m_isPK = false; m_GuildID = 0; m_pQuestManager = new QuestManager(this); m_pTimeLimitItemManager = new TimeLimitItemManager( this ); m_bLotto = false; m_pQuestItem = NULL; m_pPetInfo = NULL; m_RankExpSaveCount = 0; m_pRank = NULL; m_pPet = NULL; m_PetStash.reserve( MAX_PET_STASH ); for ( int i=0; i<MAX_PET_STASH; ++i ) m_PetStash.push_back(NULL); __END_CATCH}//////////////////////////////////////////////////////////////////////////////// destructor//////////////////////////////////////////////////////////////////////////////PlayerCreature::~PlayerCreature() throw(){ __BEGIN_TRY // 牢亥配府 昏力 SAFE_DELETE(m_pInventory); SAFE_DELETE(m_pGoodsInventory); // 付快胶 器牢磐客 崔妨乐绰 酒捞袍阑 昏力茄促. if (m_pExtraInventorySlot != NULL) { Item* pItem = m_pExtraInventorySlot->getItem(); if (pItem != NULL) { if (pItem->getItemClass() == Item::ITEM_CLASS_KEY) { Key* pKey = dynamic_cast<Key*>(pItem); // 傲 埃窜窍霸 捞救俊辑 舅酒辑 粮俊辑 瘤况 林档废 窍磊. if (g_pParkingCenter->hasMotorcycleBox(pKey->getTarget())) { g_pParkingCenter->deleteMotorcycleBox(pKey->getTarget()); } } m_pExtraInventorySlot->deleteItem(); SAFE_DELETE(pItem); } SAFE_DELETE(m_pExtraInventorySlot); } // 焊包窃 昏力 SAFE_DELETE(m_pStash); // 敲贰弊 悸 昏力 SAFE_DELETE(m_pFlagSet); // RankBonus hash_map 昏力 for ( HashMapRankBonusItor itr = m_RankBonuses.begin(); itr != m_RankBonuses.end(); itr++ ) { SAFE_DELETE( itr->second ); } m_RankBonuses.clear(); if ( m_pTimeLimitItemManager != NULL ) SAFE_DELETE( m_pTimeLimitItemManager ); if ( m_pQuestManager != NULL ) SAFE_DELETE( m_pQuestManager );/* for ( list<ItemNameInfo*>::iterator itr = m_ItemNameInfoList.begin(); itr != m_ItemNameInfoList.end(); itr++ ) { ItemNameInfo* pInfo = *itr; SAFE_DELETE( pInfo ); } m_ItemNameInfoList.clear();*/ if ( m_pQuestItem != NULL ) SAFE_DELETE( m_pQuestItem ); SAFE_DELETE( m_pRank ); for ( int i=0; i<MAX_PET_STASH; ++i ) { SAFE_DELETE( m_PetStash[i] ); } __END_CATCH}//////////////////////////////////////////////////////////////////////////////// 酒捞袍 窍唱 殿废窍扁// *** 林狼 ***// 捞 窃荐甫 何福扁 傈俊 馆靛矫 OR俊促 遏阑 吧绢具 茄促.// 郴何利栏肺绰 遏阑 吧瘤 臼扁 锭巩捞促.//////////////////////////////////////////////////////////////////////////////void PlayerCreature::registerItem(Item* pItem, ObjectRegistry& OR) throw(){ __BEGIN_TRY Assert(pItem != NULL); // Item 磊眉俊 ObjectID 且寸 OR.registerObject_NOLOCKED(pItem); // 矫埃力茄 酒捞袍 概聪历俊 OID 啊 官差菌促绊 舅妨霖促. m_pTimeLimitItemManager->registerItem( pItem ); // 骇飘扼搁 救俊 乐绰 酒捞袍甸档 OID甫 罐酒初酒具 茄促. if (pItem->getItemClass() == Item::ITEM_CLASS_BELT) { Belt* pBelt = dynamic_cast<Belt*>(pItem); PocketNum_t PocketCount = pBelt->getPocketCount(); Inventory* pInventory = pBelt->getInventory(); for (int k=0; k<PocketCount; k++) { Item* pBeltItem = pInventory->getItem(k, 0); if (pBeltItem != NULL) { OR.registerObject_NOLOCKED(pBeltItem); // 矫埃力茄 酒捞袍 概聪历俊 OID 啊 官差菌促绊 舅妨霖促. m_pTimeLimitItemManager->registerItem( pBeltItem ); } } } __END_CATCH}//////////////////////////////////////////////////////////////////////////////// 牢亥配府 救俊 乐绰 酒捞袍 殿废窍扁// *** 林狼 ***// 捞 窃荐甫 何福扁 傈俊 馆靛矫 OR俊促 遏阑 吧绢具 茄促.// 郴何利栏肺绰 遏阑 吧瘤 臼扁 锭巩捞促.//////////////////////////////////////////////////////////////////////////////void PlayerCreature::registerInventory(ObjectRegistry& OR) throw(){ __BEGIN_TRY list<Item*> ItemList; int height = m_pInventory->getHeight(); int width = m_pInventory->getWidth(); for (int j=0; j<height; j++) { for (int i=0; i<width; i++) { Item* pItem = m_pInventory->getItem(i, j); if (pItem != NULL) { // 殿废等 酒捞袍狼 府胶飘俊辑 泅犁 酒捞袍阑 茫绰促. list<Item*>::iterator itr = find(ItemList.begin(), ItemList.end(), pItem); if (itr == ItemList.end()) { // 鞍篮 酒捞袍阑 滴锅 殿废窍瘤 臼扁 困秦辑 // 府胶飘俊促啊 酒捞袍阑 笼绢持绰促. ItemList.push_back(pItem); // 酒捞袍狼 OID甫 且寸罐绰促. registerItem(pItem, OR); i += pItem->getVolumeWidth() - 1; } } } } __END_CATCH}void PlayerCreature::registerInitInventory(ObjectRegistry& OR) throw(){ __BEGIN_TRY list<Item*> ItemList; int height = m_pInventory->getHeight(); int width = m_pInventory->getWidth(); for (int j=0; j<height; j++) { for (int i=0; i<width; i++) { Item* pItem = m_pInventory->getItem(i, j); if (pItem != NULL) { // 殿废等 酒捞袍狼 府胶飘俊辑 泅犁 酒捞袍阑 茫绰促. list<Item*>::iterator itr = find(ItemList.begin(), ItemList.end(), pItem); if (itr == ItemList.end()) { // 鞍篮 酒捞袍阑 滴锅 殿废窍瘤 臼扁 困秦辑 // 府胶飘俊促啊 酒捞袍阑 笼绢持绰促. ItemList.push_back(pItem); // ItemTrace 甫 巢辨 巴牢瘤 搬沥 pItem->setTraceItem( bTraceLog( pItem ) ); // 酒捞袍狼 OID甫 且寸罐绰促. registerItem(pItem, OR); i += pItem->getVolumeWidth() - 1; } } } } __END_CATCH}//////////////////////////////////////////////////////////////////////////////// 焊包窃 救俊 甸绢乐绰 酒捞袍 殿废窍扁//////////////////////////////////////////////////////////////////////////////void PlayerCreature::registerStash(void) throw(){ __BEGIN_TRY Zone* pZone = getZone(); ObjectRegistry& OR = pZone->getObjectRegistry(); __ENTER_CRITICAL_SECTION(OR) for (int r=0; r<STASH_RACK_MAX; r++) { for (int i=0; i<STASH_INDEX_MAX; i++) { Item* pStashItem = m_pStash->get(r, i); if (pStashItem != NULL) registerItem(pStashItem, OR); } } __LEAVE_CRITICAL_SECTION(OR) m_bStashStatus = true; __END_CATCH}void PlayerCreature::registerGoodsInventory(ObjectRegistry& OR) throw(){ __BEGIN_TRY GoodsInventory::ListItem& goods = m_pGoodsInventory->getGoods(); GoodsInventory::ListItemItr itr = goods.begin(); for ( ; itr != goods.end(); itr++ ) { registerItem( (*itr).m_pItem, OR); } __END_CATCH}void PlayerCreature::loadTimeLimitItem() throw(Error){ __BEGIN_TRY Assert( m_pTimeLimitItemManager != NULL ); m_pTimeLimitItemManager->load(); __END_CATCH}void PlayerCreature::loadItem() throw (InvalidProtocolException, Error){ __BEGIN_TRY loadTimeLimitItem(); __END_CATCH}bool PlayerCreature::wasteIfTimeLimitExpired(Item* pItem) throw (Error){ __BEGIN_TRY if ( pItem == NULL ) return false; if ( m_pTimeLimitItemManager->wasteIfTimeOver( pItem ) ) { pItem->waste( STORAGE_TIMEOVER ); return true; } return false; __END_CATCH}void PlayerCreature::sendTimeLimitItemInfo() throw(Error){ __BEGIN_TRY GCTimeLimitItemInfo gcTimeLimitItemInfo; if ( m_pTimeLimitItemManager->makeTimeLimitItemInfo( gcTimeLimitItemInfo ) ) { getPlayer()->sendPacket( &gcTimeLimitItemInfo ); } __END_CATCH}void PlayerCreature::addTimeLimitItem(Item* pItem, DWORD time) throw(Error){ m_pTimeLimitItemManager->addTimeLimitItem( pItem, time );} void PlayerCreature::sellItem( Item* pItem ) throw(Error){ __BEGIN_TRY if ( pItem->isTimeLimitItem() ) m_pTimeLimitItemManager->itemSold( pItem ); __END_CATCH}void PlayerCreature::deleteItemByMorph( Item* pItem ) throw(Error){ __BEGIN_TRY if ( pItem->isTimeLimitItem() ) m_pTimeLimitItemManager->deleteItemByMorph( pItem ); __END_CATCH}void PlayerCreature::sendCurrentQuestInfo() const throw(Error){ m_pQuestManager->sendQuestInfo();}void PlayerCreature::whenQuestLevelUpgrade(){ if ( getQuestLevel() == 40 ) { GCNoticeEvent gcNE; gcNE.setCode( NOTICE_EVENT_CAN_PET_QUEST ); getPlayer()->sendPacket(&gcNE); }}//////////////////////////////////////////////////////////////////////////////// 焊包窃 肮荐 技泼窍扁//////////////////////////////////////////////////////////////////////////////void PlayerCreature::setStashNumEx(BYTE num) throw(){ __BEGIN_TRY Statement* pStmt = NULL; setStashNum(num); BEGIN_DB { StringStream sqlSlayer; StringStream sqlVampire; StringStream sqlOusters; sqlSlayer << "UPDATE Slayer set StashNum = " << (int)num << " WHERE Name = '" << getName() << "'"; sqlVampire << "UPDATE Vampire set StashNum = " << (int)num << " WHERE Name = '" << getName() << "'"; sqlOusters << "UPDATE Ousters set StashNum = " << (int)num << " WHERE Name = '" << getName() << "'"; pStmt = g_pDatabaseManager->getConnection("DARKEDEN")->createStatement(); pStmt->executeQuery(sqlSlayer.toString()); if ( !isOusters() ) pStmt->executeQuery(sqlVampire.toString()); else pStmt->executeQuery(sqlOusters.toString()); SAFE_DELETE(pStmt); } END_DB(pStmt) __END_CATCH}//////////////////////////////////////////////////////////////////////////////// 焊包窃俊 甸绢乐绰 捣 技泼窍扁//////////////////////////////////////////////////////////////////////////////void PlayerCreature::setStashGoldEx(Gold_t gold) throw(){ __BEGIN_TRY //cout << "setStashGoldEx Called" << "Name:" << getName() << " Gold: " << (int)gold << endl; Statement* pStmt = NULL; setStashGold(gold); BEGIN_DB { StringStream sqlSlayer; StringStream sqlVampire; StringStream sqlOusters; sqlSlayer << "UPDATE Slayer set StashGold = " << (int)gold << " WHERE Name = '" << getName() << "'"; sqlVampire << "UPDATE Vampire set StashGold = " << (int)gold << " WHERE Name = '" << getName() << "'"; sqlOusters << "UPDATE Ousters set StashGold = " << (int)gold << " WHERE Name = '" << getName() << "'"; pStmt = g_pDatabaseManager->getConnection("DARKEDEN")->createStatement(); pStmt->executeQuery(sqlSlayer.toString()); if ( !isOusters() ) pStmt->executeQuery(sqlVampire.toString()); else pStmt->executeQuery(sqlOusters.toString()); SAFE_DELETE(pStmt); } END_DB(pStmt) __END_CATCH}//////////////////////////////////////////////////////////////////////////////// 焊包窃俊 甸绢乐绰 捣 技泼窍扁//////////////////////////////////////////////////////////////////////////////void PlayerCreature::increaseStashGoldEx(Gold_t gold) throw(){ __BEGIN_TRY Statement* pStmt = NULL; setStashGold(m_StashGold + gold); BEGIN_DB { StringStream sqlSlayer; StringStream sqlVampire; StringStream sqlOusters; sqlSlayer << "UPDATE Slayer set StashGold = " << (int)m_StashGold << " WHERE Name = '" << getName() << "'"; sqlVampire << "UPDATE Vampire set StashGold = " << (int)m_StashGold << " WHERE Name = '" << getName() << "'"; sqlOusters << "UPDATE Ousters set StashGold = " << (int)m_StashGold << " WHERE Name = '" << getName() << "'"; pStmt = g_pDatabaseManager->getConnection("DARKEDEN")->createStatement(); pStmt->executeQuery(sqlSlayer.toString()); if ( !isOusters() ) pStmt->executeQuery(sqlVampire.toString()); else pStmt->executeQuery(sqlOusters.toString()); SAFE_DELETE(pStmt); } END_DB(pStmt) __END_CATCH}//////////////////////////////////////////////////////////////////////////////// 焊包窃俊 甸绢乐绰 捣 技泼窍扁//////////////////////////////////////////////////////////////////////////////void PlayerCreature::decreaseStashGoldEx(Gold_t gold) throw(){ __BEGIN_TRY Statement* pStmt = NULL; setStashGold(m_StashGold - gold); BEGIN_DB { StringStream sqlSlayer; StringStream sqlVampire; StringStream sqlOusters; sqlSlayer << "UPDATE Slayer set StashGold = " << (int)m_StashGold << " WHERE Name = '" << getName() << "'"; sqlVampire << "UPDATE Vampire set StashGold = " << (int)m_StashGold << " WHERE Name = '" << getName() << "'"; sqlOusters << "UPDATE Ousters set StashGold = " << (int)m_StashGold << " WHERE Name = '" << getName() << "'"; pStmt = g_pDatabaseManager->getConnection("DARKEDEN")->createStatement(); pStmt->executeQuery(sqlSlayer.toString()); if ( !isOusters() ) pStmt->executeQuery(sqlVampire.toString()); else pStmt->executeQuery(sqlOusters.toString()); SAFE_DELETE(pStmt); } END_DB(pStmt) __END_CATCH}//////////////////////////////////////////////////////////////////////////////// 焊包窃 皋葛府俊辑 昏力窍扁//////////////////////////////////////////////////////////////////////////////void PlayerCreature::deleteStash(void) throw(){ __BEGIN_TRY SAFE_DELETE(m_pStash); m_StashNum = 0; __END_CATCH}//////////////////////////////////////////////////////////////////////////////// 敲贰弊悸 皋葛府俊辑 昏力窍扁//////////////////////////////////////////////////////////////////////////////void PlayerCreature::deleteFlagSet(void) throw(){ __BEGIN_TRY SAFE_DELETE(m_pFlagSet); __END_CATCH}//----------------------------------------------------------------------// 急傍磊狼 府胶飘俊 急傍磊甫 眠啊窍绰 窃荐//----------------------------------------------------------------------void PlayerCreature::addEnemy(const string& Name) throw(Error){ __BEGIN_DEBUG list<string>::iterator itr = find(m_Enemies.begin() , m_Enemies.end() , Name); // 绝促搁 眠啊窍磊 if (itr == m_Enemies.end()) { m_Enemies.push_back(Name); //cout << "急傍磊甫 眠啊茄促 : " << Name << endl; } __END_DEBUG}//----------------------------------------------------------------------// 急傍磊狼 府胶飘俊 急傍磊甫 昏力窍绰 窃荐//----------------------------------------------------------------------void PlayerCreature::deleteEnemy(const string& Name) throw(NoSuchElementException, Error){ __BEGIN_DEBUG list<string>::iterator itr = find(m_Enemies.begin(), m_Enemies.end() , Name); if (itr != m_Enemies.end()) { m_Enemies.erase(itr); //cout << "急傍磊甫 瘤款促 : " << Name << endl; } __END_DEBUG}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -