📄 npc.cpp
字号:
//////////////////////////////////////////////////////////////////////////////// Filename : NPC.cpp// Written By : 辫己刮// Description : // 盔贰绰 惑痢 贸府 何盒捞 绝菌栏唱, 捞 努贰胶甫 惑加罐酒 惑痢 NPC甫 // 父甸扁档 粱 弊贰辑, 弊成 NPC 救俊促 惑痢 牢磐其捞胶甫 笼绢持菌促.//////////////////////////////////////////////////////////////////////////////#include "NPC.h"#include "ShopRack.h"#include "mission/QuestInfoManager.h"#include "mission/RewardClassInfoManager.h"#include "PlayerCreature.h"#include "couple/PartnerWaitingManager.h"#include "Gpackets/GCNPCAskDynamic.h"//////////////////////////////////////////////////////////////////////////////// class NPC member methods//////////////////////////////////////////////////////////////////////////////NPC::NPC () throw () { __BEGIN_TRY m_pInventory = NULL; // 促澜 贸府罐阑 畔阑 瘤沥茄促. getCurrentTime(m_NextTurn); m_NextTurn.tv_sec += rand() % 3; m_NextTurn.tv_usec += rand() % 1000000; if (m_NextTurn.tv_usec >= 1000000) m_NextTurn.tv_sec++; // 牢亥配府 按眉甫 积己茄促. //m_pInventory = new Inventory(5,5); // 惑痢 柳凯厘 按眉甫 积己茄促. m_pRack = new ShopRack[SHOP_RACK_TYPE_MAX]; Assert(m_pRack != NULL); // 惑痢 矫技 函荐甫 叼弃飘肺 技泼秦霖促. m_MarketCondBuy = 25; m_MarketCondSell = 100; // 扁夯利栏肺 惑痢篮 老馆 惑痢捞促. m_ShopType = SHOPTYPE_NORMAL; m_ClanType = 0; // 弊成 狼固绝绰 default. // 肋给秦辑 VisionInfo俊辑 Sight甫 茫绰 版快 措厚 // by sigi. 2002.9.6 m_Sight = 5; //m_pQuestBoard = NULL; m_pCoupleRegisterManager = NULL; m_pCoupleUnregisterManager = NULL; m_pQuestInfoManager = NULL; m_pRewardClassInfoManager = NULL; __END_CATCH}NPC::NPC (const string & name) throw () { __BEGIN_TRY m_Name = name; m_pInventory = NULL; // 促澜 贸府罐阑 畔阑 瘤沥茄促. getCurrentTime(m_NextTurn); m_NextTurn.tv_sec += rand() % 3; m_NextTurn.tv_usec += rand() % 1000000; if (m_NextTurn.tv_usec >= 1000000) m_NextTurn.tv_sec ++; // 牢亥配府 按眉甫 积己茄促. //m_pInventory = new Inventory(5,5); // 惑痢 柳凯厘 按眉甫 积己茄促. m_pRack = new ShopRack[SHOP_RACK_TYPE_MAX]; Assert(m_pRack != NULL); // 惑痢 矫技 函荐甫 叼弃飘肺 技泼秦霖促. m_MarketCondBuy = 25; m_MarketCondSell = 100; m_pCoupleRegisterManager = NULL; m_pCoupleUnregisterManager = NULL; m_pQuestInfoManager = NULL; m_pRewardClassInfoManager = NULL; __END_CATCH}NPC::~NPC() throw (Error){ __BEGIN_TRY SAFE_DELETE(m_pCoupleUnregisterManager); SAFE_DELETE(m_pCoupleRegisterManager); SAFE_DELETE(m_pQuestInfoManager); SAFE_DELETE(m_pRewardClassInfoManager); SAFE_DELETE(m_pInventory); SAFE_DELETE_ARRAY(m_pRack); __END_CATCH}// registerObject()// Zone俊 辆加等 ObjectRegistry甫 荤侩秦辑, // NPC 客 家蜡酒捞袍甸狼 ObjectID甫 且寸罐绰促.// 泅犁肺绰 殿废秦具 且 巴篮 NPC 磊脚狼 OID 观俊 绝促.void NPC::registerObject () throw (Error){ __BEGIN_TRY Assert(getZone() != NULL); ObjectRegistry & OR = getZone()->getObjectRegistry(); __ENTER_CRITICAL_SECTION(OR) OR.registerObject_NOLOCKED(this); __LEAVE_CRITICAL_SECTION(OR) __END_CATCH}// load()// 捞 NPC客 包访等 单捞磐甸阑 肺靛茄促.// 胶农赋飘唱, 飘府芭 殿殿.bool NPC::load () throw (Error){ __BEGIN_TRY // trigger 甫 肺爹茄促. m_TriggerManager.load(m_Name); // AtFirst 牧叼记捞 乐栏搁, 角青窍绊 昏力茄促. if (m_TriggerManager.hasCondition(Condition::CONDITION_AT_FIRST)) { list<Trigger*>& triggers = m_TriggerManager.getTriggers(); list<Trigger*>::iterator itr = triggers.begin(); for (; itr != triggers.end(); itr++) { Trigger* pTrigger = *itr; if (pTrigger->hasCondition(Condition::CONDITION_AT_FIRST)) { pTrigger->activate(this); triggers.erase(itr); break; } } } return true; __END_CATCH}// init()// 单捞磐甸阑 檬扁拳窍绊...粮俊 NPC甫 殿废茄促.void NPC::init () throw (Error){ __BEGIN_TRY load(); //registerObject(); __END_CATCH}// act()// 霸烙 辑滚狼 皋牢 风橇付促 茄锅究 阂府绰 窃荐捞促.// AI 内靛啊 荐青登绰 皋牢 窃荐扼 且 荐 乐促.void NPC::act(const Timeval& currentTime) throw (Error){ __BEGIN_TRY __BEGIN_DEBUG // 泅犁 矫埃捞 促澜 畔焊促 农促搁, 酒流 粱 歹 扁促妨具 茄促. // 弊犯瘤 臼栏搁, 咀记阑 秒茄促. if (currentTime < m_NextTurn) return; // 促澜 畔阑 瘤沥茄促. // 泅犁 NPC甸篮 1檬俊 1鸥老父 框流捞扁 东矫肺.. =_=; Timeval delay; delay.tv_sec = 0; delay.tv_usec = 750000 + rand() % 200000; m_NextTurn = m_NextTurn + delay; if ( m_pCoupleRegisterManager != NULL ) m_pCoupleRegisterManager->heartbeat(); if ( m_pCoupleUnregisterManager != NULL ) m_pCoupleUnregisterManager->heartbeat(); // 飘府芭甫 啊瘤绊 乐阑 版快, 阿 飘府芭甸狼 炼扒捞 父练登绰瘤 眉农茄促. // 父距 漂沥 飘府芭狼 葛电 炼扒捞 父练茄促搁, 弊 飘府芭俊 秦寸登绰 // 咀记阑 角青窍绊 府畔茄促. 恐衬窍搁, 飘府芭 开矫 咀记捞骨肺, // 老窜 咀记篮 茄 畔俊 茄锅父 角青登扁 锭巩捞促. list<Trigger*>& triggers = m_TriggerManager.getTriggers(); list<Trigger*>::iterator itr = triggers.begin(); for (; itr != triggers.end(); itr++) { Trigger* pTrigger = *itr; if (pTrigger->isAllSatisfied(Trigger::ACTIVE_TRIGGER , this)) { pTrigger->activate(this); return; } } __END_DEBUG __END_CATCH}// getShopVersion()// 瘤沥等 辆幅狼 惑痢狼 滚傈阑 府畔茄促.ShopVersion_t NPC::getShopVersion(ShopRackType_t type) const{ Assert(type < SHOP_RACK_TYPE_MAX); return m_pRack[type].getVersion();}// setShopVersion()// 瘤沥等 辆幅狼 惑痢狼 滚傈阑 技泼茄促.void NPC::setShopVersion(ShopRackType_t type, ShopVersion_t ver){ Assert(type < SHOP_RACK_TYPE_MAX); m_pRack[type].setVersion(ver);}// increaseShopVersion()// 瘤沥等 辆幅狼 惑痢狼 滚傈阑 棵赴促.void NPC::increaseShopVersion(ShopRackType_t type){ Assert(type < SHOP_RACK_TYPE_MAX); m_pRack[type].increaseVersion();}// isExistShopItem()// 瘤沥等 辆幅客 牢郸胶狼 酒捞袍捞 惑痢 柳凯厘 救俊 粮犁窍绰瘤 府畔茄促.bool NPC::isExistShopItem(ShopRackType_t type, BYTE index) const{ Assert(type < SHOP_RACK_TYPE_MAX); return m_pRack[type].isExist(index);}// insertShopItem()// 瘤沥等 辆幅客 牢郸胶狼 柳凯厘俊促啊 酒捞袍阑 笼绢持绰促.void NPC::insertShopItem(ShopRackType_t type, BYTE index, Item* pItem){ Assert(type < SHOP_RACK_TYPE_MAX); m_pRack[type].insert(index, pItem);}// removeShopItem()// 瘤沥等 辆幅客 牢郸胶狼 柳凯厘俊辑 酒捞袍阑 力芭茄促.void NPC::removeShopItem(ShopRackType_t type, BYTE index){ Assert(type < SHOP_RACK_TYPE_MAX); return m_pRack[type].remove(index);}// getShopItem()// 瘤沥等 辆幅客 牢郸胶狼 柳凯厘俊 乐绰 酒捞袍 器牢磐甫 府畔茄促.Item* NPC::getShopItem(ShopRackType_t type, BYTE index) const{ Assert(type < SHOP_RACK_TYPE_MAX); return m_pRack[type].get(index);}// clearShopItem()// 柳凯厘阑 没家(?)茄促.void NPC::clearShopItem(void){ for (int i=0; i<SHOP_RACK_TYPE_MAX; i++) m_pRack[i].clear();}// getFirstEmptySlot()// 瘤沥等 辆幅狼 柳凯厘俊辑 力老 菊率狼 后 沫阑 茫绰促.BYTE NPC::getFirstEmptySlot(ShopRackType_t type) const{ Assert(type < SHOP_RACK_TYPE_MAX); return m_pRack[type].getFirstEmptySlot();}// getLastEmptySlot()// 瘤沥等 辆幅狼 柳凯厘俊辑 力老 第率狼 后 沫阑 茫绰促.BYTE NPC::getLastEmptySlot(ShopRackType_t type) const{ Assert(type < SHOP_RACK_TYPE_MAX); return m_pRack[type].getLastEmptySlot();}// isFull()// 瘤沥等 辆幅狼 柳凯厘捞 泅犁 菜蛮 惑怕牢瘤甫 府畔茄促.bool NPC::isFull(ShopRackType_t type) const{ Assert(type < SHOP_RACK_TYPE_MAX); return m_pRack[type].isFull();}// isEmpty// 瘤沥等 辆幅狼 柳凯厘捞 泅犁 后 惑怕牢瘤甫 府畔茄促.bool NPC::isEmpty(ShopRackType_t type) const{ Assert(type < SHOP_RACK_TYPE_MAX); return m_pRack[type].isEmpty();}// SimpleQuest by sigi. 2002.12.3/*bool NPC::regenSimpleQuest() throw (Error){ __BEGIN_TRY#ifdef __ACTIVE_QUEST__ if (m_pQuestBoard==NULL) { m_pQuestBoard = new QuestBoard(); } else { m_pQuestBoard->release(); } // 抛胶飘.. 5俺父 积己. m_pQuestBoard->regenerate( 5 );#endif return true; __END_CATCH}bool NPC::giveSimpleQuest(Creature* pCreature, QuestID_t qid) throw (Error){ __BEGIN_TRY#ifdef __ACTIVE_QUEST__ if (m_pQuestBoard!=NULL) { Assert(pCreature!=NULL); PlayerCreature* pPC = dynamic_cast<PlayerCreature*>(pCreature); Quest* pQuest = m_pQuestBoard->remove( qid ); // 弊繁 QuestID绰 绝促. if (pQuest==NULL) { // cout << "No Such Quest(" << (int)qid << ")" << endl; return false; } m_pQuestBoard->remove( qid ); pQuest->take( pPC ); if (pPC->addQuest( pQuest )) { return true; } // quest 眠啊 角菩 SAFE_DELETE(pQuest); //cout << "cannot add Quest(" << (int)qid << ")" << endl; }#endif return false; __END_CATCH}void NPC::setSimpleQuestListScript(Script* pScript) throw (Error){ __BEGIN_TRY#ifdef __ACTIVE_QUEST__ if (m_pQuestBoard!=NULL) { Assert(pScript!=NULL); m_pQuestBoard->setScript(pScript); }#endif __END_CATCH}*//*void NPC::sendSimpleQuestListPacket(Creature* pCreature) throw (Error){ __BEGIN_TRY#ifdef __ACTIVE_QUEST__ if (m_pQuestBoard!=NULL) { Assert(pCreature!=NULL); Assert(pCreature->isPC()); GCNPCAskDynamic npcAskPacket; npcAskPacket.setObjectID( getObjectID() ); m_pQuestBoard->makeNPCAskPacket(npcAskPacket); pCreature->getPlayer()->sendPacket( &npcAskPacket ); }#endif __END_CATCH}*/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////string NPC::toString () const throw (){ __BEGIN_TRY StringStream msg; msg << "NPC(" << "ObjectID:" << (int)m_ObjectID << ",SpriteType:" << (int)m_SpriteType << ",Name:" << m_Name << ",MainColor:" << (int)m_MainColor << ",SubColor:" << (int)m_SubColor << ",X:" << (int)m_X << ",Y:" << (int)m_Y << ",Sight:" << (int)m_Sight << m_TriggerManager.toString() << ")"; return msg.toString(); __END_CATCH}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -