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

📄 piercing.cpp

📁 天之炼狱1服务器端源文件游戏服务端不完整
💻 CPP
字号:
//////////////////////////////////////////////////////////////////////////////// Filename    : Piercing.cpp// Written by  : excel96// Description : //////////////////////////////////////////////////////////////////////////////#include "Piercing.h"#include "ItemUtil.h"#include "Geometry.h"#include "Effect.h"#include "Gpackets/GCSkillToTileOK1.h"#include "Gpackets/GCSkillToTileOK2.h"#include "Gpackets/GCSkillToTileOK3.h"#include "Gpackets/GCSkillToTileOK4.h"#include "Gpackets/GCSkillToTileOK5.h"//////////////////////////////////////////////////////////////////////////////// 浇饭捞绢 坷宏璃飘 勤甸矾//////////////////////////////////////////////////////////////////////////////void Piercing::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 	{		Zone* pZone = pSlayer->getZone();		Creature* pTargetCreature = pZone->getCreature(TargetObjectID);		// NoSuch力芭. by sigi. 2002.5.2		if (pTargetCreature==NULL)		{			executeSkillFailException(pSlayer, getSkillType());			return;		}		execute(pSlayer, pTargetCreature->getX(), pTargetCreature->getY(), pSkillSlot, CEffectID);	} 	catch (Throwable & t) 	{		executeSkillFailException(pSlayer, getSkillType());	}	//cout << "TID[" << Thread::self() << "]" << getSkillHandlerName() << " End" << endl;	__END_CATCH}//////////////////////////////////////////////////////////////////////////////// 浇饭捞绢 伎橇 勤甸矾//////////////////////////////////////////////////////////////////////////////void Piercing::execute(Slayer* pSlayer, ZoneCoord_t X, ZoneCoord_t Y, 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);		// 公厘窍绊 乐绰 公扁啊 NULL捞芭唱, 醚 拌凯捞 酒聪扼搁 荤侩且 荐 绝促.		// 醚 拌凯 吝俊辑档 SG绰 捞 扁贱阑 荤侩且 荐 绝促.		Item* pWeapon = pSlayer->getWearItem(Slayer::WEAR_RIGHTHAND);		if (pWeapon == NULL || !isArmsWeapon(pWeapon) || pWeapon->getItemClass() == Item::ITEM_CLASS_SG)		{			executeSkillFailException(pSlayer, getSkillType());			//cout << "TID[" << Thread::self() << "]" << getSkillHandlerName() << " end" << endl;			return;		}		bool bIncreaseExp = pSlayer->isRealWearingEx(Slayer::WEAR_RIGHTHAND);		GCSkillToTileOK1 _GCSkillToTileOK1;		GCSkillToTileOK2 _GCSkillToTileOK2;		GCSkillToTileOK3 _GCSkillToTileOK3;		GCSkillToTileOK4 _GCSkillToTileOK4;		GCSkillToTileOK5 _GCSkillToTileOK5;		SkillType_t       SkillType  = pSkillSlot->getSkillType();		SkillInfo*        pSkillInfo = g_pSkillInfoManager->getSkillInfo(SkillType);		SkillDomainType_t DomainType = pSkillInfo->getDomainType();		Level_t           SkillLevel = pSkillSlot->getExpLevel();		// 醚俊 醚舅捞 巢酒乐促搁...		if (getRemainBullet(pWeapon) > 0)		{			// 力老 刚历 醚舅 箭磊甫 冻绢哆赴促.			decreaseBullet(pWeapon);			// 茄惯镜锭付促 历厘且 鞘夸 绝促. by sigi. 2002.5.9			//pWeapon->save(pSlayer->getName(), STORAGE_GEAR, 0, Slayer::WEAR_RIGHTHAND, 0);			Bullet_t RemainBullet = getRemainBullet(pWeapon);			int  RequiredMP  = (int)pSkillInfo->getConsumeMP();			bool bManaCheck  = hasEnoughMana(pSlayer, RequiredMP);			bool bTimeCheck  = verifyRunTime(pSkillSlot);			bool bRangeCheck = verifyDistance(pSlayer, X, Y, pWeapon->getRange());			if (bManaCheck && bTimeCheck && bRangeCheck)			{				// MP甫 冻绢哆赴促.				decreaseMana(pSlayer, RequiredMP, _GCSkillToTileOK1);				// 谅钎客 规氢阑 备茄促.				ZoneCoord_t myX = pSlayer->getX();				ZoneCoord_t myY = pSlayer->getY();				Dir_t       dir = calcDirection(myX, myY, X, Y);				list<POINT> ptList;				getPointsFromLineEx(myX, myY, X, Y, pWeapon->getRange(), ptList);				// 单固瘤, 瘤加矫埃 殿阑 拌魂茄促.				SkillInput input(pSlayer, pSkillSlot);				SkillOutput output;				computeOutput(input, output);				Damage_t SkillDamage = output.Damage, Damage = 0;				Exp_t Point = pSkillInfo->getPoint();				VSRect rect(1, 1, pZone->getWidth()-2, pZone->getHeight()-2);				list<Creature*> cList;								bool bHit = false;				list<POINT>::iterator ptitr = ptList.begin();				for (; ptitr != ptList.end(); ptitr++)				{					int tileX = (*ptitr).x;					int tileY = (*ptitr).y;					// 粮 郴何捞绊, 救傈瘤措啊 酒聪扼搁 嘎阑 犬伏捞 乐促.					if (rect.ptInRect(tileX, tileY))					{						// 鸥老阑 罐酒柯促.						Tile& tile = pZone->getTile(tileX, tileY);						list<Creature*> targetList;						if (tile.hasCreature(Creature::MOVE_MODE_WALKING))						{							Creature* pCreature = tile.getCreature(Creature::MOVE_MODE_WALKING);							targetList.push_back(pCreature);						}						if (tile.hasCreature(Creature::MOVE_MODE_FLYING))						{							Creature* pCreature = tile.getCreature(Creature::MOVE_MODE_FLYING);							targetList.push_back(pCreature);						}						if (tile.hasCreature(Creature::MOVE_MODE_BURROWING))						{							Creature* pCreature = tile.getCreature(Creature::MOVE_MODE_BURROWING);							targetList.push_back(pCreature);						}						list<Creature*>::iterator itr = targetList.begin();						for(; itr != targetList.end(); itr++)						{							Creature* pTargetCreature = (*itr);							Assert(pTargetCreature != NULL);							// 醚 拌凯 扁贱篮 顶 加阑 力寇茄 唱赣瘤甫 傍拜且 荐啊 乐促.							bool bMoveModeCheck  = (pTargetCreature->getMoveMode() == Creature::MOVE_MODE_BURROWING) ? false : true;							bool bRaceCheck      = pTargetCreature->isNPC() || pTargetCreature->isSlayer();							bool bHitRoll        = HitRoll::isSuccess(pSlayer, pTargetCreature, SkillLevel/2);							bool bCanHit         = canHit(pSlayer, pTargetCreature, SkillType);							bool bPK             = verifyPK(pSlayer, pTargetCreature);							bool bZoneLevelCheck = checkZoneLevelToHitTarget(pTargetCreature);							if (bMoveModeCheck && !bRaceCheck && bHitRoll && bCanHit && bPK && bZoneLevelCheck							&& !pTargetCreature->isFlag(Effect::EFFECT_CLASS_COMA) )	// 磷篮 局茄抛 吧府搁 救 嘎酒具 等促. -_-; 2003.3.14							{								bool bCriticalHit = false;								Damage = computeDamage(pSlayer, pTargetCreature, SkillLevel/5, bCriticalHit) + SkillDamage;								ObjectID_t targetObjectID = pTargetCreature->getObjectID();								cList.push_back(pTargetCreature);								_GCSkillToTileOK1.addCListElement(targetObjectID);								_GCSkillToTileOK2.addCListElement(targetObjectID);								_GCSkillToTileOK4.addCListElement(targetObjectID);								_GCSkillToTileOK5.addCListElement(targetObjectID);								// 老窜 嘎绰 仇捞 罐阑 菩哦篮 澄 惑怕肺 茄 盲肺, 单固瘤甫 霖促.								setDamage(pTargetCreature, Damage, pSlayer, SkillType, NULL, &_GCSkillToTileOK1);								computeAlignmentChange(pTargetCreature, Damage, pSlayer, NULL, &_GCSkillToTileOK1);								increaseAlignment(pSlayer, pTargetCreature, _GCSkillToTileOK1);								// 农府萍拿 洒飘扼搁 惑措规阑 第肺 拱矾唱霸 茄促.								if (bCriticalHit)								{									knockbackCreature(pZone, pTargetCreature, pSlayer->getX(), pSlayer->getY());								}								// 浇饭捞绢啊 酒匆 版快俊父 嘎冕 吧肺 埃林茄促.								if (!pTargetCreature->isSlayer())								{									bHit = true;								}							}						} 					} 				}				if (bHit)				{					if (bIncreaseExp)					{						shareAttrExp(pSlayer, Damage , 1, 8, 1, _GCSkillToTileOK1);						increaseDomainExp(pSlayer, DomainType, pSkillInfo->getPoint(), _GCSkillToTileOK1);						increaseSkillExp(pSlayer, DomainType, pSkillSlot, pSkillInfo, _GCSkillToTileOK1);					}				}				// 傍拜磊狼 酒捞袍 郴备档甫 冻绢哆赴促.				decreaseDurability(pSlayer, NULL, Point, &_GCSkillToTileOK1, NULL);				_GCSkillToTileOK1.setSkillType(SkillType);				_GCSkillToTileOK1.setCEffectID(CEffectID);				_GCSkillToTileOK1.setX(X);				_GCSkillToTileOK1.setY(Y);				_GCSkillToTileOK1.setRange(dir);				_GCSkillToTileOK1.setDuration(0);				_GCSkillToTileOK1.addShortData(MODIFY_BULLET, RemainBullet);				_GCSkillToTileOK2.setObjectID(pSlayer->getObjectID());				_GCSkillToTileOK2.setSkillType(SkillType);				_GCSkillToTileOK2.setX(X);				_GCSkillToTileOK2.setY(Y);				_GCSkillToTileOK2.setRange(dir);				_GCSkillToTileOK2.setDuration(0);				_GCSkillToTileOK3.setObjectID(pSlayer->getObjectID());				_GCSkillToTileOK3.setSkillType(SkillType);				_GCSkillToTileOK3.setX(X);				_GCSkillToTileOK3.setY(Y);				_GCSkillToTileOK4.setSkillType(SkillType);				_GCSkillToTileOK4.setX(X);				_GCSkillToTileOK4.setY(Y);				_GCSkillToTileOK4.setDuration(0);				_GCSkillToTileOK4.setRange(dir);				_GCSkillToTileOK5.setObjectID(pSlayer->getObjectID());				_GCSkillToTileOK5.setSkillType(SkillType);				_GCSkillToTileOK5.setX(X);				_GCSkillToTileOK5.setY(Y);				_GCSkillToTileOK5.setRange(dir);				_GCSkillToTileOK5.setDuration(0);				pPlayer->sendPacket(&_GCSkillToTileOK1);				// 捞 扁贱俊 狼秦 康氢阑 罐绰 仇甸俊霸 菩哦阑 焊郴拎具 茄促.				for (list<Creature*>::const_iterator itr = cList.begin(); itr != cList.end(); itr++)				{					Creature * pTargetCreature = *itr;					Assert(pTargetCreature != NULL);					if (pTargetCreature->isPC())					{						_GCSkillToTileOK2.clearList();						// HP狼 函版荤亲阑 菩哦俊促 扁废茄促.						HP_t targetHP = 0;						if (pTargetCreature->isSlayer()) targetHP = (dynamic_cast<Slayer*>(pTargetCreature))->getHP(ATTR_CURRENT);						else if (pTargetCreature->isVampire()) targetHP = (dynamic_cast<Vampire*>(pTargetCreature))->getHP(ATTR_CURRENT);						else if (pTargetCreature->isOusters()) targetHP = (dynamic_cast<Ousters*>(pTargetCreature))->getHP(ATTR_CURRENT);						_GCSkillToTileOK2.addShortData(MODIFY_CURRENT_HP, targetHP);						// 酒捞袍狼 郴备仿阑 冻绢哆赴促.						decreaseDurability(NULL, pTargetCreature, Point, NULL, &_GCSkillToTileOK2);						// 菩哦阑 焊郴霖促.						pTargetCreature->getPlayer()->sendPacket(&_GCSkillToTileOK2);					}					else if (pTargetCreature->isMonster())					{						// 寸辟 利栏肺 牢侥茄促.						Monster* pMonster = dynamic_cast<Monster*>(pTargetCreature);						pMonster->addEnemy(pSlayer);					}				}				cList.push_back(pSlayer);				cList = pZone->broadcastSkillPacket(myX, myY, X, Y, &_GCSkillToTileOK5 , cList);				pZone->broadcastPacket(myX, myY,  &_GCSkillToTileOK3 , cList);				pZone->broadcastPacket(X, Y,  &_GCSkillToTileOK4 , cList);				// set Next Run Time				pSkillSlot->setRunTime(output.Delay);			}			else			{				executeSkillFailNormalWithGun(pSlayer, getSkillType(), NULL, RemainBullet);			}		}		else		{			executeSkillFailException(pSlayer, getSkillType());		}	}	catch (Throwable & t)	{		executeSkillFailException(pSlayer, getSkillType());	}	//cout << "TID[" << Thread::self() << "]" << getSkillHandlerName() << " End" << endl;	__END_CATCH}Piercing g_Piercing;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -