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

📄 multishot.cpp

📁 天之炼狱1服务器端源文件游戏服务端不完整
💻 CPP
📖 第 1 页 / 共 2 页
字号:
//////////////////////////////////////////////////////////////////////////////// Filename    : MultiShot.cpp// Written by  : // Description : //////////////////////////////////////////////////////////////////////////////#include "MultiShot.h"#include "Gpackets/GCSkillToTileOK1.h"#include "Gpackets/GCSkillToTileOK2.h"#include "Gpackets/GCSkillToTileOK3.h"#include "Gpackets/GCSkillToTileOK4.h"#include "Gpackets/GCSkillToTileOK5.h"#include "ItemUtil.h"#include <list>//////////////////////////////////////////////////////////////////////////////// 积己磊 - 付胶农甫 檬扁拳茄促.//////////////////////////////////////////////////////////////////////////////MultiShot::MultiShot()	throw(){	__BEGIN_TRY	// SG 付胶农绰 规氢苞绰 包拌绝捞 亲惑 + 葛剧捞促.	m_pSGMask[0].set(-1, -1);	m_pSGMask[1].set(0, -1);	m_pSGMask[2].set(1, -1);	m_pSGMask[3].set(-1,  0);	m_pSGMask[4].set(0,  0);	m_pSGMask[5].set(1,  0);	m_pSGMask[6].set(-1,  1);	m_pSGMask[7].set(0,  1);	m_pSGMask[8].set(1,  1);	// AR 付胶农甫 檬扁拳矫挪促.	// SwordWave客 厚搅窍瘤父, SwordWave绰 矫傈磊 林困甫 	// 付胶农甫 捞侩秦 八荤窍瘤父. MultiShot篮 鸥百狼 林困甫 付胶农甫	// 捞侩秦 八荤茄促绰 巴阑 积阿秦具 茄促.	//	// (-1,-1)(0,-1)(1,-1)	// (-1, 0)(0, 0)(1, 0)	// (-1, 1)(0, 1)(1, 1)	//	// 阿 规氢俊 蝶扼 绢蠢 鸥老捞 疙吝 措惑捞衬甫	// 积阿窍搁 付胶农甫 捞秦窍扁 奖促.	m_pARMask[LEFT][0].set(0,-1);	m_pARMask[LEFT][1].set(0, 0);	m_pARMask[LEFT][2].set(0, 1);	m_pARMask[RIGHT][0].set(0,-1);	m_pARMask[RIGHT][1].set(0, 0);	m_pARMask[RIGHT][2].set(0, 1);	m_pARMask[UP][0].set(-1,0);	m_pARMask[UP][1].set(0,0);	m_pARMask[UP][2].set(1,0);	m_pARMask[DOWN][0].set(-1,0);	m_pARMask[DOWN][1].set(0,0);	m_pARMask[DOWN][2].set(1,0);	m_pARMask[LEFTUP][0].set(1,-1);	m_pARMask[LEFTUP][1].set(0, 0);	m_pARMask[LEFTUP][2].set(-1, 1);	m_pARMask[RIGHTDOWN][0].set(1,-1);	m_pARMask[RIGHTDOWN][1].set(0, 0);	m_pARMask[RIGHTDOWN][2].set(-1, 1);	m_pARMask[LEFTDOWN][0].set(-1,-1);	m_pARMask[LEFTDOWN][1].set(0, 0);	m_pARMask[LEFTDOWN][2].set(1, 1);	m_pARMask[RIGHTUP][0].set(-1,-1);	m_pARMask[RIGHTUP][1].set(0, 0);	m_pARMask[RIGHTUP][2].set(1, 1);	__END_CATCH}//////////////////////////////////////////////////////////////////////////////// 浇饭捞绢 坷宏璃飘 勤甸矾//////////////////////////////////////////////////////////////////////////////void MultiShot::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();		Assert(pZone != NULL);		Creature* pTargetCreature = pZone->getCreature(TargetObjectID);		//Assert(pTargetCreature != NULL);		// NoSuch力芭. by sigi. 2002.5.2		if (pTargetCreature==NULL)		{			executeSkillFailException(pSlayer, getSkillType());			return;		}		// 酒捞袍捞 绝芭唱, 醚 拌凯狼 公扁啊 酒聪芭唱, SR捞扼搁		// 捞 扁贱阑 荤侩且 荐 绝促.		Item* pItem = pSlayer->getWearItem(Slayer::WEAR_RIGHTHAND);		if (pItem == NULL 			|| !isArmsWeapon(pItem))			// SR档 荤侩 啊瓷窍霸 荐沥. by sigi. 2002.12.3			//	|| pItem->getItemClass() == Item::ITEM_CLASS_SR)		{			executeSkillFailException(pSlayer, getSkillType());			return;		}		Item::ItemClass IClass = pItem->getItemClass();		if (IClass == Item::ITEM_CLASS_SG) 		{			SGexecute(pSlayer, pTargetCreature->getX(), pTargetCreature->getY(), pSkillSlot, CEffectID);		} 		else if (IClass == Item::ITEM_CLASS_AR 				|| IClass == Item::ITEM_CLASS_SMG				// SR档 荤侩 啊瓷窍霸 荐沥. by sigi. 2002.12.3				|| IClass == Item::ITEM_CLASS_SR) 		{			ARSMGexecute(pSlayer, pTargetCreature->getX(), pTargetCreature->getY(), pSkillSlot, CEffectID);		}	} 	catch (Throwable & t) 	{		executeSkillFailException(pSlayer, getSkillType());	}	//cout << "TID[" << Thread::self() << "]" << getSkillHandlerName() << " End" << endl;	__END_CATCH}//////////////////////////////////////////////////////////////////////////////// 浇饭捞绢 坷宏璃飘 勤甸矾//////////////////////////////////////////////////////////////////////////////void MultiShot::execute(Slayer* pSlayer, ZoneCoord_t X, ZoneCoord_t Y,  SkillSlot* pSkillSlot, CEffectID_t CEffectID)	throw(Error){	__BEGIN_TRY	Assert(pSlayer != NULL);	Assert(pSkillSlot != NULL);	try 	{		Zone* pZone = pSlayer->getZone();		Assert(pZone != NULL);		// 酒捞袍捞 绝芭唱, 醚 拌凯狼 公扁啊 酒聪芭唱, SR捞扼搁		// 捞 扁贱阑 荤侩且 荐 绝促.		Item* pItem = pSlayer->getWearItem(Slayer::WEAR_RIGHTHAND);		if (pItem == NULL 			|| !isArmsWeapon(pItem))			// SR档 荤侩 啊瓷窍霸 荐沥. by sigi. 2002.12.3			//|| pItem->getItemClass() == Item::ITEM_CLASS_SR)		{			executeSkillFailException(pSlayer, getSkillType());			return;		}		Item::ItemClass IClass = pItem->getItemClass();		if (IClass == Item::ITEM_CLASS_SG) 		{			SGexecute(pSlayer, X, Y, pSkillSlot, CEffectID);		} 		else if (IClass == Item::ITEM_CLASS_AR 				|| IClass == Item::ITEM_CLASS_SMG				// SR档 荤侩 啊瓷窍霸 荐沥. by sigi. 2002.12.3				|| IClass == Item::ITEM_CLASS_SR) 		{			ARSMGexecute(pSlayer, X, Y, pSkillSlot, CEffectID);		}	} 	catch (Throwable & t) 	{		executeSkillFailException(pSlayer, getSkillType());	}	__END_CATCH}//////////////////////////////////////////////////////////////////////////////// 浇饭捞绢 鸥老 勤甸矾 - SG甫 甸绊 乐阑 版快//////////////////////////////////////////////////////////////////////////////void MultiShot::SGexecute(Slayer* pSlayer, ZoneCoord_t X, ZoneCoord_t Y, SkillSlot* pSkillSlot, CEffectID_t CEffectID)	throw(Error){	__BEGIN_TRY	//cout << "TID[" << Thread::self() << "]" << getSkillHandlerName() << " SGexecute  Begin" << endl;	Assert(pSlayer != NULL);	Assert(pSkillSlot != NULL);	try 	{		Player* pPlayer = pSlayer->getPlayer();		Zone* pZone = pSlayer->getZone();		Assert(pPlayer != NULL);		Assert(pZone != NULL);		GCSkillToTileOK1 _GCSkillToTileOK1;		GCSkillToTileOK2 _GCSkillToTileOK2;		GCSkillToTileOK3 _GCSkillToTileOK3;		GCSkillToTileOK4 _GCSkillToTileOK4;		GCSkillToTileOK5 _GCSkillToTileOK5;		SkillInfo*        pSkillInfo = g_pSkillInfoManager->getSkillInfo(getSkillType());		SkillDomainType_t DomainType = pSkillInfo->getDomainType();		Level_t 	      SkillLevel = pSkillSlot->getExpLevel();		Item* pWeapon = pSlayer->getWearItem(Slayer::WEAR_RIGHTHAND);		Assert(pWeapon != NULL);		bool bIncreaseExp = pSlayer->isRealWearingEx(Slayer::WEAR_RIGHTHAND); 		int  RequiredMP   = (int)pSkillInfo->getConsumeMP();		bool bManaCheck   = hasEnoughMana(pSlayer, RequiredMP);		bool bTimeCheck   = verifyRunTime(pSkillSlot);		bool bRangeCheck  = verifyDistance(pSlayer, X, Y, pWeapon->getRange());		bool bBulletCheck = (getRemainBullet(pWeapon) > 0) ? true : false;		// 醚舅 荐绰 公炼扒 冻绢哆赴促.		Bullet_t RemainBullet = 0;		if (bBulletCheck)		{			decreaseBullet(pWeapon);			// 茄惯镜锭付促 历厘且 鞘夸 绝促. by sigi. 2002.5.9			//pWeapon->save(pSlayer->getName(), STORAGE_GEAR, 0, Slayer::WEAR_RIGHTHAND, 0);			RemainBullet = getRemainBullet(pWeapon);		}		// 单固瘤, 捧三 焊呈胶, 谅钎客 规氢阑 备茄促.		int         ToHitBonus    = 0;		int         DamageBonus   = 0;		int         ToHitPenalty  = 0;		int         DamagePenalty = 0;		ZoneCoord_t myX           = pSlayer->getX();		ZoneCoord_t myY           = pSlayer->getY();			Dir_t       dir           = calcDirection(myX, myY, X, Y);		bool        bHit          = false; // 茄锅捞扼档 嘎疽绰啊甫 历厘窍扁 困茄 函荐		Damage_t    Damage        = 0;     // 付瘤阜栏肺 涝腮 单固瘤甫 历厘窍扁 困茄 函荐		// SG老 版快俊绰 4何磐 矫累秦辑 9鳖瘤狼 splash 单固瘤甫 涝腮促.		int Splash = 3 + pSkillSlot->getExpLevel()/10 + 1;		if (bManaCheck && bTimeCheck && bRangeCheck && bBulletCheck)		{			decreaseMana(pSlayer, RequiredMP, _GCSkillToTileOK1);			SkillInput input(pSlayer, pSkillSlot);			SkillOutput output;			computeOutput(input, output);			// output.ToHit蔼捞 澜荐捞扁 锭巩俊, %蔼捞 澜荐肺 倒酒柯促.			ToHitPenalty = getPercentValue(pSlayer->getToHit(), output.ToHit);			list<Creature*> cList;			list<Creature*> creatureList;			getSplashVictims(pZone, X, Y, Creature::CREATURE_CLASS_MAX, creatureList, Splash);			list<Creature*>::iterator itr = creatureList.begin();			for (; itr != creatureList.end(); itr++)			{				Creature* pTargetCreature = (*itr);				Assert(pTargetCreature != NULL);				ToHitBonus  = computeArmsWeaponToHitBonus(pWeapon, myX, myY, pTargetCreature->getX(), pTargetCreature->getY());				DamageBonus = computeArmsWeaponDamageBonus(pWeapon, myX, myY, pTargetCreature->getX(), pTargetCreature->getY());				bool bInvokerCheck   = (pTargetCreature->getObjectID() == pSlayer->getObjectID()) ? true : false;				bool bRaceCheck      = pTargetCreature->isSlayer() || pTargetCreature->isNPC();				bool bHitRoll        = HitRoll::isSuccess(pSlayer, pTargetCreature, ToHitPenalty + ToHitBonus);				bool bPK             = verifyPK(pSlayer, pTargetCreature);				bool bZoneLevelCheck = checkZoneLevelToHitTarget(pTargetCreature);				if ( pTargetCreature->isFlag( Effect::EFFECT_CLASS_NO_DAMAGE )					|| pTargetCreature->isFlag( Effect::EFFECT_CLASS_COMA )				)				{					bHitRoll = false;				}				if (!bInvokerCheck && !bRaceCheck && bHitRoll && bPK && bZoneLevelCheck)				{					bool bCriticalHit = false;					// 单固瘤甫 拌魂秦辑 其澄萍甫 啊茄促.					// 焊呈胶绰 钢萍鸡 其澄萍 锭巩俊 澜荐啊 瞪 荐档 乐促.					Damage        = computeDamage(pSlayer, pTargetCreature, SkillLevel/5, bCriticalHit);					DamagePenalty = getPercentValue(Damage, output.Damage);					Damage        = max(0, Damage + DamagePenalty + DamageBonus);					// 皋牢 鸥百阑 力寇窍绊绰, 胶敲贰矫 单固瘤甫 涝绰单,					// 胶敲贰矫 单固瘤绰 老馆 单固瘤狼 50%促.					if (pTargetCreature->getX() != X || pTargetCreature->getY() != Y)					{						Damage = Damage/2;					}					// 家靛傀捞宏客绰 崔府 农肺胶 墨款磐 眉农绰 窍瘤 臼绰促.					ObjectID_t targetObjectID = pTargetCreature->getObjectID();					cList.push_back(pTargetCreature);					_GCSkillToTileOK1.addCListElement(targetObjectID);					_GCSkillToTileOK2.addCListElement(targetObjectID);					_GCSkillToTileOK5.addCListElement(targetObjectID);										setDamage(pTargetCreature, Damage, pSlayer, getSkillType(), NULL, &_GCSkillToTileOK1);					computeAlignmentChange(pTargetCreature, Damage, pSlayer, NULL, &_GCSkillToTileOK1);					increaseAlignment(pSlayer, pTargetCreature, _GCSkillToTileOK1);					// 农府萍拿 洒飘扼搁 惑措规阑 第肺 拱矾唱霸 茄促.					if (bCriticalHit)					{						knockbackCreature(pZone, pTargetCreature, myX, myY);					}					// 浇饭捞绢 酒囱 版快俊父 hit茄 吧肺 埃林茄促.					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);				}			}			_GCSkillToTileOK1.addShortData(MODIFY_BULLET, RemainBullet);			// 醚舅 箭磊甫 临捞绊, 醚舅 箭磊甫 历厘窍绊, 巢篮 醚舅 箭磊甫 罐篮 促澜俊 郴备仿阑 冻绢哆赴促.			decreaseDurability(pSlayer, NULL, pSkillInfo->getPoint(), &_GCSkillToTileOK1, NULL);			_GCSkillToTileOK1.setSkillType(getSkillType());			_GCSkillToTileOK1.setCEffectID(CEffectID);			_GCSkillToTileOK1.setX(X);

⌨️ 快捷键说明

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