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

📄 attackarms.cpp

📁 天之炼狱1服务器端源文件游戏服务端不完整
💻 CPP
📖 第 1 页 / 共 2 页
字号:
//////////////////////////////////////////////////////////////////////////////// Filename    : AttackArms.cpp// Written by  : elca@ewestsoft.com// Description ://////////////////////////////////////////////////////////////////////////////#include "AttackArms.h"#include "ItemUtil.h"#include <fstream>#include <list>#include "Gpackets/GCAttackArmsOK1.h"#include "Gpackets/GCAttackArmsOK2.h"#include "Gpackets/GCAttackArmsOK3.h"#include "Gpackets/GCAttackArmsOK4.h"#include "Gpackets/GCAttackArmsOK5.h"#include "Gpackets/GCSkillToTileOK1.h"#include "Gpackets/GCSkillToTileOK2.h"#include "Gpackets/GCSkillToTileOK3.h"#include "Gpackets/GCSkillToTileOK4.h"#include "Gpackets/GCSkillToTileOK5.h"//////////////////////////////////////////////////////////////////////////////// 浇饭捞绢 坷宏璃飘 勤甸矾//////////////////////////////////////////////////////////////////////////////void AttackArms::execute(Slayer* pSlayer, ObjectID_t TargetObjectID)	throw(Error){	__BEGIN_TRY __BEGIN_DEBUG	//cout << "TID[" << Thread::self() << "]" << getSkillHandlerName() << " Begin(slayer)" << endl;	Assert(pSlayer != NULL);	try 	{		Player* pPlayer = pSlayer->getPlayer();		Zone* pZone = pSlayer->getZone();		Assert(pPlayer != NULL);		Assert(pZone != NULL);		Creature* pTargetCreature = pZone->getCreature(TargetObjectID);		//Assert(pTargetCreature != NULL);		// NPC绰 傍拜且 荐 绝促.		if (pTargetCreature==NULL	// NoSuch力芭 锭巩俊.. by sigi. 2002.5.2			|| pTargetCreature->isNPC())		{			executeSkillFailException(pSlayer, getSkillType());			//cout << "TID[" << Thread::self() << "]" << getSkillHandlerName() << " End(slayer)" << endl;			return;		}		// 菩哦阑 霖厚窍绊...		GCAttackArmsOK1   _GCAttackArmsOK1;		GCAttackArmsOK2   _GCAttackArmsOK2;		GCAttackArmsOK3   _GCAttackArmsOK3;		GCAttackArmsOK4   _GCAttackArmsOK4;		GCAttackArmsOK5   _GCAttackArmsOK5;		_GCAttackArmsOK5.setSkillSuccess(false);		_GCAttackArmsOK1.setSkillSuccess(false);		// 胶懦 浇儿阑 罐酒柯促.		SkillSlot* pSkillSlot = pSlayer->getSkill(SKILL_ATTACK_ARMS);		Assert(pSkillSlot != NULL);		// 浇饭捞绢啊 静绊 乐绰 酒捞袍阑 啊廉柯促.		// 盖颊捞芭唱, 醚 辆幅狼 公扁啊 酒聪扼搁 俊矾促.		Item* pWeapon = pSlayer->getWearItem(Slayer::WEAR_RIGHTHAND);		if (pWeapon == NULL || isArmsWeapon(pWeapon) == false) 		{			executeSkillFailException(pSlayer, getSkillType());			//cout << "TID[" << Thread::self() << "]" << getSkillHandlerName() << " End(slayer)" << endl;			return;		}		bool bIncreaseDomainExp = pSlayer->isRealWearingEx(Slayer::WEAR_RIGHTHAND);		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);		}		// 醚俊 醚舅捞 巢酒乐促搁...		if (bBulletCheck) 		{			SkillDomainType_t DomainType  = SKILL_DOMAIN_GUN;			int               ToHitBonus  = 0;			int               DamageBonus = 0;			ZoneCoord_t       myX         = pSlayer->getX();			ZoneCoord_t       myY         = pSlayer->getY();			ZoneCoord_t       targetX     = pTargetCreature->getX();			ZoneCoord_t       targetY     = pTargetCreature->getY();			Dir_t             dir         = calcDirection(myX, myY, targetX, targetY);			int Splash = computeArmsWeaponSplashSize(pWeapon, myX, myY, targetX, targetY);			////////////////////////////////////////////////////////////////////////////////			// SG啊 酒囱 促弗 醚狼 老馆 傍拜			////////////////////////////////////////////////////////////////////////////////			if (Splash == 0)			{				ToHitBonus  = computeArmsWeaponToHitBonus(pWeapon, myX, myY, targetX, targetY);				DamageBonus = computeArmsWeaponDamageBonus(pWeapon, myX, myY, targetX, targetY);				bool bHitRoll    = HitRoll::isSuccess(pSlayer, pTargetCreature, ToHitBonus);				bool bTimeCheck  = verifyRunTime(pSkillSlot);				bool bRangeCheck = verifyDistance(pSlayer, pTargetCreature, pWeapon->getRange());				bool bPK         = verifyPK(pSlayer, pTargetCreature);				// 傍拜磊客 惑措狼 酒捞袍 郴备己 冻绢飘覆.				// 关俊 乐带吧 捞率栏肺 颗板促. by sigi. 2002.5.13				decreaseDurability(pSlayer, pTargetCreature, 1, &_GCAttackArmsOK1, &_GCAttackArmsOK2);				if (bHitRoll && bTimeCheck && bRangeCheck && bPK) 				{					bool bCriticalHit = false;					Damage_t Damage = computeDamage(pSlayer, pTargetCreature, 0, bCriticalHit) + DamageBonus;					setDamage(pTargetCreature, Damage, pSlayer, getSkillType(), &_GCAttackArmsOK2, &_GCAttackArmsOK1);					computeAlignmentChange(pTargetCreature, Damage, pSlayer, &_GCAttackArmsOK2, &_GCAttackArmsOK1);					// 农府萍拿 洒飘扼搁 惑措规阑 第肺 拱矾唱霸 茄促.					if (bCriticalHit)					{						knockbackCreature(pZone, pTargetCreature, myX, myY);					}					if (!pTargetCreature->isSlayer())					{						if ( bIncreaseDomainExp )						{							shareAttrExp(pSlayer, Damage , 1, 8, 1, _GCAttackArmsOK1);							increaseDomainExp(pSlayer, DomainType , 1, _GCAttackArmsOK1);						}						increaseAlignment(pSlayer, pTargetCreature, _GCAttackArmsOK1);					}					_GCAttackArmsOK5.setSkillSuccess(true);					_GCAttackArmsOK1.setSkillSuccess(true);					if (pTargetCreature->isPC()) 					{						Player* pTargetPlayer = pTargetCreature->getPlayer();						if (pTargetPlayer != NULL) 						{ 							_GCAttackArmsOK2.setObjectID(pSlayer->getObjectID());							pTargetPlayer->sendPacket(&_GCAttackArmsOK2);						}					} 					else if (pTargetCreature->isMonster())					{						Monster* pMonster = dynamic_cast<Monster*>(pTargetCreature);						pMonster->addEnemy(pSlayer);					}				}				_GCAttackArmsOK1.setObjectID(TargetObjectID);				_GCAttackArmsOK1.setBulletNum(RemainBullet);				_GCAttackArmsOK3.setObjectID(pSlayer->getObjectID());				_GCAttackArmsOK3.setTargetXY (targetX, targetY);								_GCAttackArmsOK4.setTargetObjectID (TargetObjectID);								_GCAttackArmsOK5.setObjectID(pSlayer->getObjectID());				_GCAttackArmsOK5.setTargetObjectID (TargetObjectID);				pPlayer->sendPacket(&_GCAttackArmsOK1);				list<Creature *> cList;				cList.push_back(pTargetCreature);				cList.push_back(pSlayer);				cList = pZone->broadcastSkillPacket(myX, myY, targetX, targetY, &_GCAttackArmsOK5, cList);				pZone->broadcastPacket(myX, myY, &_GCAttackArmsOK3, cList);				pZone->broadcastPacket(targetX, targetY, &_GCAttackArmsOK4, cList);			}			////////////////////////////////////////////////////////////////////////////////			// SG绰 扁夯利栏肺 splash啊 甸绢埃促. 			////////////////////////////////////////////////////////////////////////////////			else			{				Damage_t Damage = 0;     // 付瘤阜栏肺 涝腮 单固瘤甫 历厘窍扁 困茄 函荐.				bool     bHit   = false; // 茄 疙捞扼档 嘎疽绰啊甫 历厘窍扁 困茄 函荐.				GCSkillToTileOK1  _GCSkillToTileOK1;				GCSkillToTileOK2  _GCSkillToTileOK2;				GCSkillToTileOK3  _GCSkillToTileOK3;				GCSkillToTileOK4  _GCSkillToTileOK4;				GCSkillToTileOK5  _GCSkillToTileOK5;								list<Creature*> creatureList;				list<Creature*> cList;				getSplashVictims(pZone, targetX, targetY, pTargetCreature->getCreatureClass(), creatureList, Splash);				list<Creature*>::iterator itr = creatureList.begin();				for (; itr != creatureList.end(); itr++)				{					Creature* pEnemy = (*itr);					Assert(pEnemy != NULL);					ToHitBonus  = computeArmsWeaponToHitBonus(pWeapon, myX, myY, pEnemy->getX(), pEnemy->getY());					DamageBonus = computeArmsWeaponDamageBonus(pWeapon, myX, myY, pEnemy->getX(), pEnemy->getY());					bool bInvokerCheck   = (pEnemy->getObjectID() == pSlayer->getObjectID()) ? true : false;					bool bHitRoll        = HitRoll::isSuccess(pSlayer, pEnemy, ToHitBonus);					bool bPK             = verifyPK(pSlayer, pEnemy);					bool bZoneLevelCheck = checkZoneLevelToHitTarget(pEnemy);					if (!bInvokerCheck && bHitRoll && bPK && bZoneLevelCheck)					{						bool bCriticalHit = false;						Damage = computeDamage(pSlayer, pEnemy, 0, bCriticalHit);						// 皋牢 鸥百阑 力寇窍绊绰, 胶敲贰矫 单固瘤甫 涝绰单,						// 胶敲贰矫 单固瘤绰 老馆 单固瘤狼 50%捞促.						if (pTargetCreature != pEnemy)						{							Damage = Damage/2;						}						ObjectID_t targetObjectID = pEnemy->getObjectID();						cList.push_back(pEnemy);						_GCSkillToTileOK1.addCListElement(targetObjectID);						_GCSkillToTileOK2.addCListElement(targetObjectID);						_GCSkillToTileOK5.addCListElement(targetObjectID);						setDamage(pEnemy, Damage, pSlayer, getSkillType(), NULL, &_GCSkillToTileOK1);						computeAlignmentChange(pEnemy, Damage, pSlayer, NULL, &_GCSkillToTileOK1);						increaseAlignment(pSlayer, pEnemy, _GCSkillToTileOK1);						// 农府萍拿 洒飘扼搁 惑措规阑 第肺 拱矾唱霸 茄促.						if (bCriticalHit)

⌨️ 快捷键说明

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