📄 absorbsoul.cpp
字号:
//////////////////////////////////////////////////////////////////////////////// Filename : AbsorbSoul.cpp// Written by : elca@ewestsoft.com// Description ://////////////////////////////////////////////////////////////////////////////#include "AbsorbSoul.h"#include "item/Larva.h"#include "item/Pupa.h"#include "Corpse.h"#include "OustersCorpse.h"#include "PCOustersInfo3.h"#include "ItemFactoryManager.h"#include "ItemUtil.h"#include "Properties.h"#include "Gpackets/GCSkillToTileOK1.h"#include "Gpackets/GCSkillToTileOK2.h"#include "Gpackets/GCSkillToTileOK5.h"#include "Gpackets/GCSkillToInventoryOK1.h"#include "Gpackets/GCSkillFailed1.h"//////////////////////////////////////////////////////////////////////////////// 酒快胶磐胶 坷宏璃飘 勤甸矾//////////////////////////////////////////////////////////////////////////////// 胶懦狼 搬苞甫 2锅 朝妨拎具 等促.// 扼官 父甸扁俊 措茄 巴 窍唱 窍绊// 软康俊 包茄 巴 窍唱.// 弊贰辑 贸澜俊 炼扒 眉农窍促啊 角菩且 版快俊// SkillFail 菩哦阑 2锅 焊郴霖促.// ///////////////////////////////////////////////////////////////////////////void AbsorbSoul::execute(Ousters* pOusters, ObjectID_t TargetObjectID, ZoneCoord_t TargetZoneX, ZoneCoord_t TargetZoneY, ObjectID_t ItemObjectID, CoordInven_t InvenX, CoordInven_t InvenY, CoordInven_t TargetInvenX, CoordInven_t TargetInvenY ) throw(Error){ __BEGIN_TRY Assert(pOusters != NULL); // 努扼捞攫飘俊 遏捞 吧妨乐栏搁 八刘 菩哦阑 2锅 焊郴拎具 等促. bool bClientLocked = InvenX != 255; try { Player* pPlayer = pOusters->getPlayer(); Zone* pZone = pOusters->getZone(); Assert(pPlayer != NULL); Assert(pZone != NULL); // 磷篮 矫眉啊 Creature 老 荐档 乐绊 Item 老 荐档 乐促.. Item* pTargetItem = pZone->getItem(TargetObjectID); Creature* pTargetCreature = NULL; if ( pTargetItem == NULL ) { pTargetCreature = pZone->getCreature(TargetObjectID); } if (pTargetCreature == NULL && pTargetItem == NULL) { executeAbsorbSoulSkillFail(pOusters, getSkillType(), TargetObjectID, false, bClientLocked); return; } // NPC绰 傍拜且 荐啊 绝促. // 公利惑怕 眉农. by sigi.2002.9.5 // 救 磷篮 局绰 康 弧 荐 绝促. by Sequoia.2003. 3. 20 if ( pTargetCreature != NULL ) { if ( pTargetCreature->isNPC() || pTargetCreature->isFlag(Effect::EFFECT_CLASS_NO_DAMAGE) || !pTargetCreature->isFlag(Effect::EFFECT_CLASS_COMA) ) { executeAbsorbSoulSkillFail(pOusters, getSkillType(), TargetObjectID, false, bClientLocked); return; } if ( pTargetCreature->isFlag(Effect::EFFECT_CLASS_CANNOT_ABSORB_SOUL) ) { // executeAbsorbSoulSkillFail(pOusters, getSkillType(), TargetObjectID, true, bClientLocked); return; } } else if ( pTargetItem != NULL ) { if ( pTargetItem->getItemClass() != Item::ITEM_CLASS_CORPSE ) { executeAbsorbSoulSkillFail(pOusters, getSkillType(), TargetObjectID, false, bClientLocked); return; } if ( pTargetItem->isFlag(Effect::EFFECT_CLASS_CANNOT_ABSORB_SOUL) ) { executeAbsorbSoulSkillFail(pOusters, getSkillType(), TargetObjectID, true, bClientLocked); return; } } else { executeAbsorbSoulSkillFail(pOusters, getSkillType(), TargetObjectID, false, bClientLocked); return; } GCSkillToTileOK1 _GCSkillToTileOK1; GCSkillToTileOK2 _GCSkillToTileOK2; GCSkillToTileOK5 _GCSkillToTileOK5; //bool bRangeCheck = verifyDistance(pOusters, pTargetCreature, 2); // 鸥 辆练狼 矫眉俊 软康阑 茄 版快 (酒流 矫眉啊 Creature 牢 版快) if ( pTargetCreature != NULL ) //&& bRangeCheck) { // 软康俊 措茄 版氰摹绰?? - 唱吝俊 荐沥 ?? Exp_t Exp = computeCreatureExp(pTargetCreature, BLOODDRAIN_EXP); int targetLevel = 0; if (pTargetCreature->isSlayer()) { Slayer* pTargetSlayer = dynamic_cast<Slayer*>(pTargetCreature); targetLevel = pTargetSlayer->getHighestSkillDomainLevel(); } else if (pTargetCreature->isVampire()) { Vampire* pTargetVampire = dynamic_cast<Vampire*>(pTargetCreature); targetLevel = pTargetVampire->getLevel(); } else if (pTargetCreature->isOusters()) { Ousters* pTargetOusters = dynamic_cast<Ousters*>(pTargetCreature); targetLevel = pTargetOusters->getLevel(); } else if (pTargetCreature->isMonster()) { Monster* pMonster = dynamic_cast<Monster*>(pTargetCreature); targetLevel = pMonster->getLevel(); } // 仟颇 父甸扁俊 措茄 贸府啊 刚历 登绢具 茄促. // 扼官甫 仟颇肺 父甸绢拎具 茄促 // 蝶肺 窃荐肺 锭辑 关俊辑 备泅 且 巴烙 // SkillOK甫 焊郴扁 傈俊 酒捞袍俊 措茄 贸府 菩哦阑 刚历 焊郴具 茄促. 馆!靛!矫! if ( InvenX != 255 ) makeLarvaToPupa( pOusters, targetLevel, ItemObjectID, InvenX, InvenY, TargetInvenX, TargetInvenY ); // 软康阑 窍霸 登搁 软康茄 荤恩狼 SP啊 棵扼埃促. // 捞芭 绢痘霸 瞪瘤 唱吝俊 歹 毫具瞪淀 // HealPoint == Exp 烙 -_- MP_t HealPoint = Exp; MP_t CurrentMP = pOusters->getMP(); MP_t MaxMP = pOusters->getMP(ATTR_MAX); MP_t NewMP = min((int)MaxMP , (int)CurrentMP + (int)HealPoint); // 酒快胶磐令狼 MP甫 技泼茄促. pOusters->setMP(NewMP); GCModifyInformation gcMI; gcMI.addShortData( MODIFY_CURRENT_MP, pOusters->getMP(ATTR_CURRENT) ); pOusters->getPlayer()->sendPacket( &gcMI ); _GCSkillToTileOK1.setSkillType(getSkillType()); _GCSkillToTileOK1.addCListElement(TargetObjectID); _GCSkillToTileOK1.setDuration(0); _GCSkillToTileOK1.setX(TargetZoneX); _GCSkillToTileOK1.setY(TargetZoneY); _GCSkillToTileOK1.setRange(0); _GCSkillToTileOK5.setSkillType(getSkillType()); _GCSkillToTileOK5.setObjectID(pOusters->getObjectID()); _GCSkillToTileOK5.addCListElement(TargetObjectID); _GCSkillToTileOK5.setX(TargetZoneX); _GCSkillToTileOK5.setY(TargetZoneY); _GCSkillToTileOK5.setRange(0); _GCSkillToTileOK5.setDuration(0); pPlayer->sendPacket(&_GCSkillToTileOK1); if (pTargetCreature != NULL && pTargetCreature->isPC()) { Player* pTargetPlayer = pTargetCreature->getPlayer(); if (pTargetPlayer != NULL) { _GCSkillToTileOK2.setSkillType(getSkillType()); _GCSkillToTileOK2.setObjectID(pOusters->getObjectID()); _GCSkillToTileOK2.addCListElement(TargetObjectID); _GCSkillToTileOK2.setX(TargetZoneX); _GCSkillToTileOK2.setY(TargetZoneY); _GCSkillToTileOK2.setRange(0); _GCSkillToTileOK2.setDuration(0); pTargetPlayer->sendPacket(&_GCSkillToTileOK2); } } list<Creature *> cList; cList.push_back(pTargetCreature); cList.push_back(pOusters); pZone->broadcastPacket(pOusters->getX(), pOusters->getY(), &_GCSkillToTileOK5 , cList); // 酒澜 -_- 软康 寸茄 饶俊 肚 软康 给窍霸 阜酒具 登绊 // 软康 寸茄 饶俊 何劝 救 登档废 阜酒具窃 pTargetCreature->setFlag(Effect::EFFECT_CLASS_CANNOT_ABSORB_SOUL); } else if ( pTargetItem != NULL ) //&& bRangeCheck) { Corpse* pTargetCorpse = dynamic_cast<Corpse*>(pTargetItem); int targetLevel = 0; Exp_t Exp = 0; if ( pTargetCorpse->getItemType() == OUSTERS_CORPSE ) { OustersCorpse* pOustersCorpse = dynamic_cast<OustersCorpse*>(pTargetCorpse); Assert( pOustersCorpse != NULL ); if ( pOustersCorpse->getOustersInfo().getName() == pOusters->getName() ) { executeAbsorbSoulSkillFail(pOusters, getSkillType(), TargetObjectID, true, bClientLocked); return; } } if ( pTargetCorpse->getItemType() == MONSTER_CORPSE || pTargetCorpse->getItemType() == SLAYER_CORPSE || pTargetCorpse->getItemType() == VAMPIRE_CORPSE || pTargetCorpse->getItemType() == OUSTERS_CORPSE ) { targetLevel = (int)(pTargetCorpse->getLevel()); Exp = (Exp_t)(pTargetCorpse->getExp()); } else { executeAbsorbSoulSkillFail(pOusters, getSkillType(), TargetObjectID, false, bClientLocked); return; } // 仟颇 父甸扁俊 措茄 贸府啊 刚历 登绢具 茄促. // 扼官甫 仟颇肺 父甸绢拎具 茄促 // 蝶肺 窃荐肺 锭辑 关俊辑 备泅 且 巴烙 // SkillOK甫 焊郴扁 傈俊 酒捞袍俊 措茄 贸府 菩哦阑 刚历 焊郴具 茄促. 馆!靛!矫! if ( bClientLocked ) makeLarvaToPupa( pOusters, targetLevel, ItemObjectID, InvenX, InvenY, TargetInvenX, TargetInvenY ); // 软康阑 窍霸 登搁 软康茄 荤恩狼 SP啊 棵扼埃促. // 捞芭 绢痘霸 瞪瘤 唱吝俊 歹 毫具瞪淀 // HealPoint == Exp 烙 -_- MP_t HealPoint = Exp; MP_t CurrentMP = pOusters->getMP(); MP_t MaxMP = pOusters->getMP(ATTR_MAX); MP_t NewMP = min((int)MaxMP , (int)CurrentMP + (int)HealPoint); // 酒快胶磐令狼 MP甫 技泼茄促. pOusters->setMP(NewMP); GCModifyInformation gcMI; gcMI.addShortData( MODIFY_CURRENT_MP, pOusters->getMP(ATTR_CURRENT) ); pOusters->getPlayer()->sendPacket( &gcMI ); _GCSkillToTileOK1.setSkillType(getSkillType()); _GCSkillToTileOK1.addCListElement(TargetObjectID); _GCSkillToTileOK1.setDuration(0); _GCSkillToTileOK1.setX(TargetZoneX); _GCSkillToTileOK1.setY(TargetZoneY); _GCSkillToTileOK1.setRange(0); _GCSkillToTileOK5.setSkillType(getSkillType()); _GCSkillToTileOK5.setObjectID(pOusters->getObjectID()); _GCSkillToTileOK5.addCListElement(TargetObjectID); _GCSkillToTileOK5.setX(TargetZoneX); _GCSkillToTileOK5.setY(TargetZoneY); _GCSkillToTileOK5.setRange(0); _GCSkillToTileOK5.setDuration(0); pPlayer->sendPacket(&_GCSkillToTileOK1); list<Creature *> cList; cList.push_back(pOusters); pZone->broadcastPacket(pOusters->getX(), pOusters->getY(), &_GCSkillToTileOK5 , cList); // 酒澜 -_- 软康 寸茄 饶俊 肚 软康 给窍霸 阜酒具 凳 pTargetItem->setFlag(Effect::EFFECT_CLASS_CANNOT_ABSORB_SOUL); } else { executeAbsorbSoulSkillFail(pOusters, getSkillType(), TargetObjectID, false, bClientLocked); } } catch (Throwable & t) { executeAbsorbSoulSkillFail(pOusters, getSkillType(), TargetObjectID, false, bClientLocked); } //cout << "TID[" << Thread::self() << "]" << getSkillHandlerName() << " End(vampire)" << endl; __END_CATCH}void AbsorbSoul::makeLarvaToPupa(Ousters* pOusters, int TargetLevel, ObjectID_t ItemObjectID, CoordInven_t InvenX, CoordInven_t InvenY, CoordInven_t TargetInvenX, CoordInven_t TargetInvenY ) throw(){ __BEGIN_TRY Inventory* pInventory = pOusters->getInventory(); Assert(pInventory != NULL); Zone* pZone = pOusters->getZone(); Assert(pZone != NULL ); if ( InvenX >= pInventory->getWidth() || InvenY >= pInventory->getHeight() || TargetInvenX >= pInventory->getWidth() || TargetInvenY >= pInventory->getHeight() ) { executeSkillFailException( pOusters, getSkillType() ); return; } Item* pLarva = pInventory->getItem( InvenX, InvenY ); if ( pLarva == NULL || pLarva->getItemClass() != Item::ITEM_CLASS_LARVA || pLarva->getObjectID() != ItemObjectID ) { executeSkillFailException( pOusters, getSkillType() ); return; } ItemType_t LarvaType = pLarva->getItemType(); // int ratio = ( 100 * TargetLevel ) / ( (pOusters->getLevel() * 2) * ( pLarva->getItemType() + 1 ) );// 犬伏 4硅肺 刘啊 int ratio = ( 200 * TargetLevel ) / ( pOusters->getLevel() * ( pLarva->getItemType() + 1 ) ); // 仟颇 父甸扁 角菩 if ( (rand()%100) > ratio ) { executeSkillFailException( pOusters, getSkillType() ); return; } // 犬伏篮 逞菌栏聪 -_- 仟颇甫 父甸绢杭鳖 list<OptionType_t> optionNULL; Item* pPupa = g_pItemFactoryManager->createItem( Item::ITEM_CLASS_PUPA, pLarva->getItemType(), optionNULL ); // 扼官狼 肮荐甫 临咯霖促. // 捞 窃荐 救俊辑 扼官狼 肮荐啊 磊悼利栏肺 窍唱 临绢甸绊, // 父老 1俺牢 扼官看促搁 牢亥配府 棺 DB俊辑 昏力登霸 等促. decreaseItemNum(pLarva, pInventory, pOusters->getName(), STORAGE_INVENTORY, 0, InvenX, InvenY); // 扁粮狼 仟颇甫 啊廉柯促. Item* pPrevPupa = pInventory->getItem( TargetInvenX, TargetInvenY ); GCSkillToInventoryOK1 gcSkillToInventoryOK1; if ( pPrevPupa != NULL ) { // 扁粮俊 歹且 仟颇啊 乐促搁 if ( !canStack( pPrevPupa, pPupa ) || pPrevPupa->getNum() >= ItemMaxStack[ (int)pPrevPupa->getItemClass() ] ) { executeSkillFailException( pOusters, getSkillType() ); return; } // 肮荐甫 窍唱 刘啊矫虐绊 历厘茄促. pPrevPupa->setNum( pPrevPupa->getNum() + 1 ); pPrevPupa->save( pOusters->getName(), STORAGE_INVENTORY, 0, TargetInvenX, TargetInvenY ); // 困何盒狼 decreaseItemNum() 窃荐 何盒俊辑 酒捞袍 箭磊甫 皑家矫虐骨肺, // 咯扁辑 促矫 牢亥配府狼 酒捞袍 箭磊甫 刘啊矫挪促. pInventory->increaseNum(); // 父甸绢柳 仟颇绰 扁粮狼 仟颇俊 歹秦脸栏骨肺 昏力茄促. SAFE_DELETE( pPupa ); gcSkillToInventoryOK1.setObjectID( pPrevPupa->getObjectID() ); } else { ObjectRegistry& OR = pZone->getObjectRegistry(); OR.registerObject( pPupa ); // 仟颇甫 Inventory 俊 笼绢持绊 DB俊促啊 积己茄促. pInventory->addItem( TargetInvenX, TargetInvenY, pPupa ); pPupa->create( pOusters->getName(), STORAGE_INVENTORY, 0, TargetInvenX, TargetInvenY ); gcSkillToInventoryOK1.setObjectID( pPupa->getObjectID() ); } gcSkillToInventoryOK1.setSkillType( getSkillType() ); gcSkillToInventoryOK1.setItemType( LarvaType ); gcSkillToInventoryOK1.setCEffectID( 0 ); gcSkillToInventoryOK1.setX( TargetInvenX ); gcSkillToInventoryOK1.setY( TargetInvenY ); pOusters->getPlayer()->sendPacket( &gcSkillToInventoryOK1 ); __END_CATCH}AbsorbSoul g_AbsorbSoul;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -