📄 pcmanager.cpp
字号:
//////////////////////////////////////////////////////////////////////////////// Filename : PCManager.cpp// Written By : Reiot// Description : //////////////////////////////////////////////////////////////////////////////#include <algorithm> // find_if ()#include <stdio.h>#include "Assert.h"#include "PCManager.h"#include "GamePlayer.h"#include "PlayerCreature.h"#include "Creature.h"#include "Slayer.h"#include "Vampire.h"#include "Ousters.h"#include "Tile.h"#include "Zone.h"#include "MonsterCorpse.h"#include "GamePlayer.h"#include "ZoneGroupManager.h"#include "ZoneInfo.h"#include "ZoneInfoManager.h"#include "ZonePlayerManager.h"#include "IncomingPlayerManager.h"#include "TimeManager.h"#include "Event.h"#include "EventResurrect.h"#include "ResurrectLocationManager.h"#include "ItemUtil.h"#include "AlignmentManager.h"#include "ItemFactoryManager.h"#include "SlayerCorpse.h"#include "VampireCorpse.h"#include "OustersCorpse.h"#include "LogClient.h"#include "Thread.h"#include "TradeManager.h"#include "SkillHandlerManager.h"#include "Relic.h"#include "RelicUtil.h"#include "ItemInfoManager.h"#include "Inventory.h"#include "CreatureUtil.h"#include "PacketUtil.h"#include "ZoneUtil.h"#include "PKZoneInfoManager.h"#include "BloodBibleBonusManager.h"#include "HolyLandManager.h"//#include "SweeperBonusManager.h"#include "LevelWarZoneInfoManager.h"#include "war/WarSystem.h"#include "EventZoneInfo.h"#include "Properties.h"#include "EffectComa.h"#include "EventTransport.h"#include "EffectPKZoneResurrection.h"#include "EffectTryingPosition.h"#include "EffectSummonCasket.h"#include "Gpackets/GCAddEffect.h"#include "Gpackets/GCCreatureDied.h"#include "Gpackets/GCGetOffMotorCycle.h"#include "Gpackets/GCSystemMessage.h"#include "Gpackets/GCRemoveEffect.h"#include "Gpackets/GCRemoveFromGear.h"#include "Gpackets/GCHolyLandBonusInfo.h"//#include "Gpackets/GCSweeperBonusInfo.h"#include <vector>//////////////////////////////////////////////////////////////////////////////// constructor//////////////////////////////////////////////////////////////////////////////PCManager::PCManager () throw (){ __BEGIN_TRY m_bRefreshHolyLandPlayer = false;// m_bRefreshLevelWarBonusZonePlayer = false; __END_CATCH} //////////////////////////////////////////////////////////////////////////////// destructor// 牧抛捞呈狼 葛电 按眉甸阑 DB俊 历厘茄 饶, 昏力茄促.//////////////////////////////////////////////////////////////////////////////PCManager::~PCManager () throw (){ __BEGIN_TRY __END_CATCH} //////////////////////////////////////////////////////////////////////////////// 粮俊 家加等 PC 甸狼 heartbeat 包访 皋筋靛甸阑 角青秦霖促.// 捞锭, PC啊 磷菌歹扼档 昏力窍搁 救等促. 恐衬窍搁, PC 啊 PC 概聪历俊辑// 昏力登搁 PC's EffectManager 狼 heartbeat 皋筋靛啊 龋免登瘤 臼扁 锭巩捞促.// 措脚 CreatureDead::unaffect()俊辑 绝俊林搁 迭 舅嘎摆促.//// 咯扁急 捞棋飘 酒捞袍俊 措茄 贸府甫 橇肺技教 窍绰 何盒捞促.// 捞 窃荐绰 Zone狼 Heart Beat俊辑 贸府登绰 风凭捞促.// 促弗 静饭靛客狼 包拌甫 混旗 杭锭, ProcessCommand啊 场抄 惑炔俊辑 贸府等促.// 弊矾唱 促弗 静饭靛俊辑 PCManager狼 deleteCreature 肚绰 addCreature甫// 窍霸 登搁 捞 窃荐 肚茄 救傈窍瘤 给且 巴捞促.//////////////////////////////////////////////////////////////////////////////void PCManager::processCreatures () throw (Error){ __BEGIN_TRY __ENTER_CRITICAL_SECTION(m_Mutex) //cerr << "TID[" << Thread::self() << "]" << "PCM::process go" << endl; Timeval currentTime; getCurrentTime(currentTime); try { hash_map< ObjectID_t , Creature* >::iterator before = m_Creatures.end(); hash_map< ObjectID_t , Creature* >::iterator current = m_Creatures.begin(); while (current != m_Creatures.end()) { Creature* pCreature = current->second; Assert(pCreature != NULL); // 啊瘤绊 乐绰 酒捞袍狼 heartbeat.. Inventory, Gear 八祸 if (pCreature->isSlayer()) { Slayer* pSlayer = dynamic_cast<Slayer*>(pCreature); Assert(pSlayer != NULL); pSlayer->heartbeat(currentTime); /* // 绢凋啊俊辑 内付 惑怕俊 吧妨乐绰单 HP啊 棵扼啊绰 泅惑捞 惯积窍绰 巴 鞍促. // 弊贰辑 内付 惑怕俊 吧妨乐栏搁 老窜 HP甫 公炼扒 0栏肺 技泼窍档废 函版茄促. if (pSlayer->isFlag(Effect::EFFECT_CLASS_COMA)) pSlayer->setHP(0, ATTR_CURRENT); */ // HolyLandRaceBonus 利侩阑 困秦 initAllStat阑 何弗促. if ( m_bRefreshHolyLandPlayer && !g_pWarSystem->hasActiveRaceWar() ) { SLAYER_RECORD prev; pSlayer->getSlayerRecord(prev); pSlayer->initAllStat(); pSlayer->sendRealWearingInfo(); pSlayer->sendModifyInfo(prev); // 己瘤胶懦阑 困秦 胶懦 格废阑 促矫 焊辰促. pSlayer->sendSlayerSkillInfo(); } } else if (pCreature->isVampire()) { Vampire* pVampire = dynamic_cast<Vampire*>(pCreature); Assert(pVampire != NULL); pVampire->heartbeat(currentTime); /* // 绢凋啊俊辑 内付 惑怕俊 吧妨乐绰单 HP啊 棵扼啊绰 泅惑捞 惯积窍绰 巴 鞍促. // 弊贰辑 内付 惑怕俊 吧妨乐栏搁 老窜 HP甫 公炼扒 0栏肺 技泼窍档废 函版茄促. if (pVampire->isFlag(Effect::EFFECT_CLASS_COMA)) pVampire->setHP(0, ATTR_CURRENT); */ if (pVampire->isFlag(Effect::EFFECT_CLASS_COMA)) { HP_t currentHP = pVampire->getHP(ATTR_CURRENT); HP_t maxHP = pVampire->getHP(ATTR_MAX); if (currentHP*3 >= maxHP) { //cout << "Target HP is over 1/3" << endl; EffectComa* pEffectComa = dynamic_cast<EffectComa*>(pVampire->findEffect(Effect::EFFECT_CLASS_COMA)); Assert(pEffectComa != NULL); if (pEffectComa->canResurrect()) { //cout << "Can Resurrect!" << endl; // 鸥百狼 捞棋飘 概聪历俊辑 内付 捞棋飘甫 昏力茄促. pVampire->deleteEffect(Effect::EFFECT_CLASS_COMA); pVampire->removeFlag(Effect::EFFECT_CLASS_COMA); // 内付 捞棋飘啊 朝酒艾促绊 舅妨霖促. GCRemoveEffect gcRemoveEffect; gcRemoveEffect.setObjectID(pVampire->getObjectID()); gcRemoveEffect.addEffectList((EffectID_t)Effect::EFFECT_CLASS_COMA); pVampire->getZone()->broadcastPacket(pVampire->getX(), pVampire->getY(), &gcRemoveEffect); // 何劝窍绊 唱辑 effect 嘿咯霖促. pVampire->getEffectManager()->sendEffectInfo(pVampire, pVampire->getZone(), pVampire->getX(), pVampire->getY()); } } } // HolyLandRaceBonus 利侩阑 困秦 initAllStat阑 何弗促. if ( m_bRefreshHolyLandPlayer && !g_pWarSystem->hasActiveRaceWar() ) { VAMPIRE_RECORD prev; pVampire->getVampireRecord(prev); pVampire->initAllStat(); pVampire->sendRealWearingInfo(); pVampire->sendModifyInfo(prev); // 己瘤胶懦阑 困秦 胶懦 格废阑 促矫 焊辰促. pVampire->sendVampireSkillInfo(); } } else if ( pCreature->isOusters() ) { Ousters* pOusters = dynamic_cast<Ousters*>(pCreature); Assert(pOusters != NULL); pOusters->heartbeat(currentTime); } if (pCreature->isDead() // transfusion锭巩俊 眠啊. isDead()绰 HP啊 0牢瘤甫 つ农窍绰单 // HP绰 盲况瘤绊 乐阑 荐 乐促. by sigi. 2002.10.8 || pCreature->isFlag(Effect::EFFECT_CLASS_COMA) && pCreature->isVampire()) { if (!pCreature->isFlag(Effect::EFFECT_CLASS_COMA)) { /////////////////////////////////////////////////////////////////// // 磷阑 锭 Relic Item阑 啊瘤绊 乐促搁 官蹿俊 冻绢哆赴促. /////////////////////////////////////////////////////////////////// dropRelicToZone(pCreature); dropFlagToZone(pCreature); dropSweeperToZone( pCreature ); /////////////////////////////////////////////////////////////////// // 磷阑 锭 己氢俊 蝶扼辑 酒捞袍阑 冻绢哆赴促. /////////////////////////////////////////////////////////////////// Zone* pZone = pCreature->getZone(); Assert(pZone != NULL); Tile& rTile = pZone->getTile( pCreature->getX(), pCreature->getY() ); EffectTryingPosition* pTryingTile = dynamic_cast<EffectTryingPosition*>(rTile.getEffect( Effect::EFFECT_CLASS_TRYING_POSITION )); if ( pTryingTile != NULL ) { MonsterCorpse* pTower = pTryingTile->getTower(); Assert( pTower != NULL ); Effect* pTryingTower = pTower->getEffectManager().findEffect( Effect::EFFECT_CLASS_SLAYER_TRYING_1 ); if ( pTryingTower != NULL ) pTryingTower->setDeadline(0); pTryingTower = pCreature->findEffect(Effect::EFFECT_CLASS_TRYING); if ( pTryingTower != NULL ) pTryingTower->setDeadline(0); } Slayer* pSlayer = NULL; Vampire* pVampire= NULL; Ousters* pOusters= NULL; Creature::CreatureClass CClass = pCreature->getCreatureClass(); if (CClass == Creature::CREATURE_CLASS_SLAYER) { pSlayer = dynamic_cast<Slayer*>(pCreature); //pCorpse = new SlayerCorpse(dynamic_cast<Slayer*>(pCreature)); int SumAttr = pSlayer->getSTR(ATTR_BASIC) + pSlayer->getDEX(ATTR_BASIC) + pSlayer->getINT(ATTR_BASIC); // 级捞 40 捞惑捞绊, 老馆 蜡历扼搁 磷阑 锭 酒捞袍阑 冻绢哆副 犬伏捞 乐促. if (SumAttr > 40 && pSlayer->getCompetence() == 3) { Alignment_t alignment = pSlayer->getAlignment(); ItemNum_t DropItemNum = g_pAlignmentManager->getDropItemNum(alignment, pSlayer->isPK()); // DropItemNum俺鳖瘤父 // 馒侩茄 蜡聪农 酒捞袍阑 冻绢哆赴促. for(int i = 0; DropItemNum>0 && i<Slayer::WEAR_MAX; i++) { Item* pItem = pSlayer->getWearItem( (Slayer::WearPart)i ); if (pItem != NULL && pItem->isUnique() && !pItem->isTimeLimitItem() ) { // by sigi. 2002.11.7 pSlayer->removeShape( pItem->getItemClass(), true ); /* GCRemoveFromGear gcRemoveFromGear; gcRemoveFromGear.setSlotID(i); gcRemoveFromGear.setDestroy(false); pSlayer->getPlayer()->sendPacket(&gcRemoveFromGear); */ if (isTwohandWeapon(pItem)) { pSlayer->deleteWearItem(Slayer::WEAR_LEFTHAND); pSlayer->deleteWearItem(Slayer::WEAR_RIGHTHAND); } else { pSlayer->deleteWearItem((Slayer::WearPart)i); } // 粮栏肺 谎赴促. TPOINT pt = pZone->addItem(pItem, pSlayer->getX(), pSlayer->getY()); if (pt.x != -1) { filelog("uniqueItem.txt", "DropByKilled: %s %s", pSlayer->getName().c_str(), pItem->toString().c_str()); pItem->save("", STORAGE_ZONE, pZone->getZoneID(), pt.x , pt.y); // ItemTraceLog 甫 巢变促 if ( pItem != NULL && pItem->isTraceItem() ) { char zoneName[15]; sprintf( zoneName, "%4d%3d%3d", pZone->getZoneID(), pt.x, pt.y); remainTraceLog( pItem, pCreature->getName(), zoneName, ITEM_LOG_MOVE, DETAIL_DROP); } } else { // ItemTraceLog 甫 巢变促 if ( pItem != NULL && pItem->isTraceItem() ) { remainTraceLog( pItem, pCreature->getName(), "GOD", ITEM_LOG_DELETE, DETAIL_DROP); } pItem->destroy(); SAFE_DELETE(pItem); } log(LOG_DROP_ITEM_DIE, pSlayer->getName(), ""); // 冻绢哆副 俺荐甫 临咯霖促. DropItemNum--; // 蜡聪农绰 公炼扒 茄俺父 冻绢哆赴促. break; } } for(int i = 0; i < DropItemNum; i++) { int RandomValue = Random(0, (int)Slayer::WEAR_MAX - 1); Item* pItem = pSlayer->getWearItem(Slayer::WearPart(RandomValue)); // 目敲傅阑 冻绢哆妨急 救等促 ぬ.ば // 2003.3.14 if ( pItem != NULL && !isCoupleRing(pItem) && !pItem->isTimeLimitItem() ) { // by sigi. 2002.11.7 pSlayer->removeShape( pItem->getItemClass(), true ); /* GCRemoveFromGear gcRemoveFromGear; gcRemoveFromGear.setSlotID(i); gcRemoveFromGear.setDestroy(false); pSlayer->getPlayer()->sendPacket(&gcRemoveFromGear); */ if (isTwohandWeapon(pItem)) { pSlayer->deleteWearItem(Slayer::WEAR_LEFTHAND); pSlayer->deleteWearItem(Slayer::WEAR_RIGHTHAND); } else { pSlayer->deleteWearItem(Slayer::WearPart(RandomValue)); } //pItem->destroy(); //pCorpse->addTreasure(pItem); // 粮栏肺 谎赴促. TPOINT pt = pZone->addItem(pItem, pSlayer->getX(), pSlayer->getY()); if (pt.x != -1) { filelog("dropItem.txt", "DropByKilled: %s %s", pSlayer->getName().c_str(), pItem->toString().c_str()); pItem->save("", STORAGE_ZONE, pZone->getZoneID(), pt.x , pt.y); // ItemTraceLog 甫 巢变促 if ( pItem != NULL && pItem->isTraceItem() ) { char zoneName[15]; sprintf( zoneName, "%4d%3d%3d", pZone->getZoneID(), pt.x, pt.y); remainTraceLog( pItem, pCreature->getName(), zoneName, ITEM_LOG_MOVE, DETAIL_DROP); } } else { // ItemTraceLog 甫 巢变促 if ( pItem != NULL && pItem->isTraceItem() ) { remainTraceLog( pItem, pCreature->getName(), "GOD", ITEM_LOG_DELETE, DETAIL_DROP); } pItem->destroy(); SAFE_DELETE(pItem); } log(LOG_DROP_ITEM_DIE, pSlayer->getName(), ""); } } } // PK 寸茄巴阑 犁 悸泼 秦 拎具 茄促. pSlayer->setPK(false); } else if (CClass == Creature::CREATURE_CLASS_VAMPIRE) { pVampire = dynamic_cast<Vampire*>(pCreature); //pCorpse = new VampireCorpse(dynamic_cast<Vampire*>(pCreature));
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -