📄 restore.cpp
字号:
//////////////////////////////////////////////////////////////////////////////// Filename : Restore.cpp// Written by : elca@ewestsoft.com// Description : //////////////////////////////////////////////////////////////////////////////#include "Restore.h"#include "PCFinder.h"#include "NPC.h"#include "DB.h"#include "Party.h"#include "TradeManager.h"#include "GuildManager.h"#include "Guild.h"#include "EffectBloodDrain.h"#include "EffectRestore.h"#include "ItemUtil.h"#include "RelicUtil.h"#include "SharedServerManager.h"#include "Gpackets/GCSkillToObjectOK1.h"#include "Gpackets/GCSkillToSelfOK1.h"#include "Gpackets/GCMorph1.h"#include "Gpackets/GCMorphSlayer2.h"#include "Gpackets/GCRemoveEffect.h"#include "Gpackets/GCDeleteObject.h"#include "Gpackets/GSGuildMemberLogOn.h"#include <stdio.h>//////////////////////////////////////////////////////////////////////////////// 浇饭捞绢 坷宏璃飘 勤甸矾//////////////////////////////////////////////////////////////////////////////void Restore::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, SkillSlot* pSkillSlot, CEffectID_t CEffectID) throw(Error){ __BEGIN_TRY //cout << "TID[" << Thread::self() << "]" << getSkillHandlerName() << " Begin" << endl; Assert(pSlayer != NULL); Assert(pSkillSlot != NULL); try { Player* pPlayer = pSlayer->getPlayer(); Zone* pZone = pSlayer->getZone(); Assert(pPlayer != NULL); Assert(pZone != NULL); Creature* pFromCreature = pZone->getCreature(TargetObjectID); // 轨颇捞绢父 扒靛副 荐啊 乐促. // NoSuch力芭. by sigi. 2002.5.2 if (pFromCreature==NULL || !pFromCreature->isVampire()) { executeSkillFailException(pSlayer, getSkillType()); //cout << "TID[" << Thread::self() << "]" << getSkillHandlerName() << " End" << endl; return; } GCSkillToObjectOK1 _GCSkillToObjectOK1; // 胶懦 敬 逞俊霸... GCMorph1 _GCMorph1; // 函脚 寸荤磊俊霸.. GCMorphSlayer2 _GCMorphSlayer2; // 函脚 备版槽甸俊霸.. SkillType_t SkillType = pSkillSlot->getSkillType(); SkillInfo* pSkillInfo = g_pSkillInfoManager->getSkillInfo(SkillType); bool bRangeCheck = verifyDistance(pSlayer, pFromCreature, pSkillInfo->getRange()); bool bHitRoll = true; if (bRangeCheck && bHitRoll) { dropRelicToZone(pFromCreature); dropFlagToZone(pFromCreature); ////////////////////////////////////////////////////////////////////// // 阿辆 粮 饭骇 沥焊甫 昏力秦具 茄促. ////////////////////////////////////////////////////////////////////// // 颇萍 檬措 吝捞扼搁 沥焊甫 昏力秦 霖促. PartyInviteInfoManager* pPIIM = pZone->getPartyInviteInfoManager(); Assert(pPIIM != NULL); pPIIM->cancelInvite(pFromCreature); // 颇萍 包访 沥焊甫 昏力秦 霖促. int PartyID = pFromCreature->getPartyID(); if (PartyID != 0) { // 刚历 肺拿俊辑 昏力窍绊... LocalPartyManager* pLPM = pZone->getLocalPartyManager(); Assert(pLPM != NULL); pLPM->deletePartyMember(PartyID, pFromCreature); // 臂肺国俊辑档 昏力秦 霖促. deleteAllPartyInfo(pFromCreature); } // 飘饭捞靛 吝捞菌促搁 飘饭捞靛 包访 沥焊甫 昏力秦霖促. TradeManager* pTM = pZone->getTradeManager(); Assert(pTM != NULL); pTM->cancelTrade(pFromCreature); ////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////// Slayer* pNewSlayer = new Slayer; Vampire* pVampire = dynamic_cast<Vampire*>(pFromCreature); // DB俊辑 趣矫 巢酒乐阑 瘤 葛福绰 软趋 沥焊甫 昏力秦霖促. Statement* pStmt = NULL; BEGIN_DB { pStmt = g_pDatabaseManager->getConnection("DARKEDEN")->createStatement(); StringStream sql; sql << "DELETE FROM EffectBloodDrain WHERE OwnerID = '" + pFromCreature->getName() + "'"; pStmt->executeQuery(sql.toString()); SAFE_DELETE(pStmt); } END_DB(pStmt) pNewSlayer->setName(pFromCreature->getName()); // 农府媚 救狼 敲饭捞绢 器牢磐客 敲饭捞绢 救狼 农府媚 器牢磐甫 盎脚茄促. Player* pFromPlayer = pFromCreature->getPlayer(); pNewSlayer->setPlayer(pFromPlayer); GamePlayer* pFromGamePlayer = dynamic_cast<GamePlayer*>(pFromPlayer); pFromGamePlayer->setCreature(pNewSlayer); // load窍搁 load茄 zone俊辑 objectID甫 罐栏骨肺 促矫 汲沥茄促. by sigi. 2002.6.4 pNewSlayer->load(); pNewSlayer->setZone(pZone); pNewSlayer->setObjectID(pFromCreature->getObjectID()); //pZone->getObjectRegistry().registerObject(pNewSlayer); pNewSlayer->setMoveMode(Creature::MOVE_MODE_WALKING); ZoneCoord_t x = pFromCreature->getX(); ZoneCoord_t y = pFromCreature->getY(); Dir_t dir = pFromCreature->getDir(); Tile& tile = pZone->getTile(x, y); // 梆 pFromCreature 溜, 盔贰狼 轨颇捞绢 按眉绰 瘤况龙 巴捞骨肺, // PCFinder俊 甸绢啊 乐绰 蔼篮 静饭扁 蔼捞 瞪 巴捞促. // 弊矾骨肺 轨颇捞绢 器牢磐甫 瘤况林绊, 货肺款 浇饭捞绢 器牢磐甫 歹茄促. g_pPCFinder->deleteCreature(pFromCreature->getName()); g_pPCFinder->addCreature(pNewSlayer); // 辨靛 泅犁 立加 糕滚 府胶飘俊辑 昏力茄促. if ( pVampire->getGuildID() != 0 ) { Guild* pGuild = g_pGuildManager->getGuild( pVampire->getGuildID() ); if ( pGuild != NULL ) { pGuild->deleteCurrentMember( pVampire->getName() ); GSGuildMemberLogOn gsGuildMemberLogOn; gsGuildMemberLogOn.setGuildID( pGuild->getID() ); gsGuildMemberLogOn.setName( pVampire->getName() ); gsGuildMemberLogOn.setLogOn( false ); g_pSharedServerManager->sendPacket( &gsGuildMemberLogOn ); Statement* pStmt = NULL; // 叼厚俊 诀单捞飘 茄促. BEGIN_DB { pStmt = g_pDatabaseManager->getConnection("DARKEDEN")->createStatement(); pStmt->executeQuery( "UPDATE GuildMember SET LogOn = 0 WHERE Name = '%s'", pVampire->getName().c_str() ); } END_DB(pStmt) } else filelog( "GuildMissing.log", "[NoSuchGuild] GuildID : %d, Name : %s\n", (int)pVampire->getGuildID(), pVampire->getName().c_str() ); } // 牢亥配府 背眉. Inventory* pInventory = pVampire->getInventory(); pNewSlayer->setInventory(pInventory); pVampire->setInventory(NULL); // 焊包窃 背眉 pNewSlayer->deleteStash(); pNewSlayer->setStash(pVampire->getStash()); pNewSlayer->setStashNum(pVampire->getStashNum()); pNewSlayer->setStashStatus(false); pVampire->setStash(NULL); /* // 啊厚瘤 背眉 while (true) { Item* pGarbage = pVampire->popItemFromGarbage(); // 歹 捞惑 绝促搁 宏饭捞农... if (pGarbage == NULL) break; pNewSlayer->addItemToGarbage(pGarbage); } */ // 敲贰弊 悸 背眉 pNewSlayer->deleteFlagSet(); pNewSlayer->setFlagSet(pVampire->getFlagSet()); pVampire->setFlagSet(NULL); Item* pItem = NULL; _TPOINT point; // 涝绊 乐绰 酒捞袍甸阑 牢亥配府 肚绰 官蹿栏肺 颗变促. for(int part = 0; part < (int)Vampire::VAMPIRE_WEAR_MAX; part++) { pItem = pVampire->getWearItem((Vampire::WearPart)part); if (pItem != NULL) { // 刚历 扁绢俊辑 昏力窍绊... if (isTwohandWeapon(pItem)) { Assert(((Vampire::WearPart)part == Vampire::WEAR_RIGHTHAND) || ((Vampire::WearPart)part==Vampire::WEAR_LEFTHAND)); Assert(pVampire->getWearItem(Vampire::WEAR_RIGHTHAND) == pVampire->getWearItem(Vampire::WEAR_LEFTHAND)); // 剧颊 酒袍. pVampire->deleteWearItem(Vampire::WEAR_RIGHTHAND); pVampire->deleteWearItem(Vampire::WEAR_LEFTHAND); } else { pVampire->deleteWearItem((Vampire::WearPart)part); } // 牢亥配府俊 磊府啊 乐栏搁 牢亥配府俊 歹窍绊... if (pInventory->getEmptySlot(pItem, point)) { pInventory->addItem(point.x, point.y, pItem); pItem->save(pNewSlayer->getName(), STORAGE_INVENTORY, 0, point.x, point.y); } else if ( pItem->isTimeLimitItem() ) { pVampire->deleteItemByMorph( pItem ); pItem->destroy(); SAFE_DELETE( pItem ); } // 磊府啊 绝栏搁 官蹿俊 冻绢哆赴促. else { ZoneCoord_t ZoneX = pVampire->getX(); ZoneCoord_t ZoneY = pVampire->getY(); TPOINT pt; pt = pZone->addItem(pItem, ZoneX , ZoneY); if (pt.x != -1) { 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, pFromCreature->getName(), zoneName, ITEM_LOG_MOVE, DETAIL_DROP); } } else { // ItemTraceLog 甫 巢变促 if ( pItem != NULL && pItem->isTraceItem() ) { remainTraceLog( pItem, pFromCreature->getName(), "GOD", ITEM_LOG_DELETE, DETAIL_DROP); } pItem->destroy(); SAFE_DELETE(pItem); } } } } pItem = pVampire->getExtraInventorySlotItem(); if (pItem != NULL) { pVampire->deleteItemFromExtraInventorySlot(); // 牢亥配府俊 磊府啊 乐栏搁 牢亥配府俊 歹窍绊... if (pInventory->getEmptySlot(pItem, point)) { pInventory->addItem(point.x, point.y, pItem); pItem->save(pNewSlayer->getName(), STORAGE_INVENTORY, 0, point.x, point.y); } else if ( pItem->isTimeLimitItem() ) { pVampire->deleteItemByMorph( pItem ); pItem->destroy(); SAFE_DELETE( pItem ); } // 磊府啊 绝栏搁 官蹿俊 冻绢哆赴促. else { TPOINT pt; ZoneCoord_t ZoneX = pVampire->getX(); ZoneCoord_t ZoneY = pVampire->getY(); pt = pZone->addItem(pItem, ZoneX , ZoneY); if (pt.x != -1) { 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, pFromCreature->getName(), zoneName, ITEM_LOG_MOVE, DETAIL_DROP); } } else { // ItemTraceLog 甫 巢变促 if ( pItem != NULL && pItem->isTraceItem() ) { remainTraceLog( pItem, pFromCreature->getName(), "GOD", ITEM_LOG_DELETE, DETAIL_DROP); } pItem->destroy(); SAFE_DELETE(pItem); } } } // 涅胶飘 酒捞袍 沥焊甫 促矫 肺靛茄促. pNewSlayer->loadTimeLimitItem(); // 轨颇捞绢 啊瘤绊 乐带 捣阑 浇饭捞绢肺 颗败霖促. // 轨颇捞绢啊 啊瘤绊 乐带 捣篮 浇饭捞绢肺 颗败啊瘤 臼绰促. // 货肺款 浇饭捞绢狼 捣阑 0栏肺 技泼茄促. pNewSlayer->setGoldEx(0); pNewSlayer->setStashGoldEx(0); // 胶懦 沥焊甫 傈价茄促. pNewSlayer->sendSlayerSkillInfo(); // 鸥老 棺 粮俊辑 扁粮 轨颇捞绢甫 昏力窍绊, 货肺款 浇饭捞绢甫 歹茄促. tile.deleteCreature(pFromCreature->getObjectID()); pZone->deletePC(pFromCreature); TPOINT pt = findSuitablePosition(pZone, x, y, Creature::MOVE_MODE_WALKING); Tile& newtile = pZone->getTile(pt.x, pt.y); newtile.addCreature(pNewSlayer); pNewSlayer->setXYDir(pt.x, pt.y, dir); pZone->addPC(pNewSlayer); // 矫具 update.. pZone->updateHiddenScan(pNewSlayer); _GCMorph1.setPCInfo2(pNewSlayer->getSlayerInfo2()); _GCMorph1.setInventoryInfo(pNewSlayer->getInventoryInfo()); _GCMorph1.setGearInfo(pNewSlayer->getGearInfo()); _GCMorph1.setExtraInfo(pNewSlayer->getExtraInfo()); _GCMorphSlayer2.setSlayerInfo(pNewSlayer->getSlayerInfo3()); pFromPlayer->sendPacket(&_GCMorph1); //pFromGamePlayer->deleteEvent(Event::EVENT_CLASS_REGENERATION); _GCSkillToObjectOK1.setSkillType(SkillType);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -