⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 absorbsoul.cpp

📁 天之炼狱1服务器端源文件游戏服务端不完整
💻 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 + -