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

📄 crosscounter.cpp

📁 天之炼狱1服务器端源文件游戏服务端不完整
💻 CPP
字号:
//////////////////////////////////////////////////////////////////////////////// Filename    : CrossCounter.cpp// Written by  : // Description : //////////////////////////////////////////////////////////////////////////////#include "CrossCounter.h"#include "EffectCrossCounter.h"#include "SkillHandlerManager.h"#include "Gpackets/GCSkillToSelfOK1.h"#include "Gpackets/GCSkillToSelfOK2.h"#include "Gpackets/GCCrossCounterOK1.h"#include "Gpackets/GCCrossCounterOK2.h"#include "Gpackets/GCCrossCounterOK3.h"#include "Gpackets/GCAddEffect.h"#include "Gpackets/GCRemoveEffect.h"//////////////////////////////////////////////////////////////////////////////// 浇饭捞绢 伎橇 勤甸矾//////////////////////////////////////////////////////////////////////////////void CrossCounter::execute(Slayer * pSlayer, SkillSlot * pSkillSlot, CEffectID_t CEffectID)	throw(Error){	__BEGIN_TRY	//cout << "TID[" << Thread::self() << "]" << getSkillHandlerName() << " Begin(slayerself)" << endl;	Assert(pSlayer != NULL);	Assert(pSkillSlot != NULL);	try 	{		Player * pPlayer = pSlayer->getPlayer();		Zone * pZone = pSlayer->getZone();		Assert(pPlayer != NULL);		Assert(pZone != NULL);		// 公厘窍绊 乐绰 公扁啊 澄捞芭唱, 八捞 酒聪扼搁 扁贱阑 荤侩且 荐 绝促.		Item* pItem = pSlayer->getWearItem(Slayer::WEAR_RIGHTHAND);		if (pItem == NULL || pItem->getItemClass() != Item::ITEM_CLASS_SWORD)		{			executeSkillFailException(pSlayer, getSkillType());			//cout << "TID[" << Thread::self() << "]" << getSkillHandlerName() << " End(slayerself)" << endl;			return;		}		bool bIncreaseDomainExp = pSlayer->isRealWearingEx(Slayer::WEAR_RIGHTHAND);		GCSkillToSelfOK1 _GCSkillToSelfOK1;		GCSkillToSelfOK2 _GCSkillToSelfOK2;		SkillType_t       SkillType  = pSkillSlot->getSkillType();		SkillInfo*        pSkillInfo = g_pSkillInfoManager->getSkillInfo(SkillType);		SkillDomainType_t DomainType = pSkillInfo->getDomainType();		int  RequiredMP  = (int)pSkillInfo->getConsumeMP();		bool bManaCheck  = hasEnoughMana(pSlayer, RequiredMP);		bool bTimeCheck  = verifyRunTime(pSkillSlot);		bool bRangeCheck = checkZoneLevelToUseSkill(pSlayer);		bool bHitRoll    = HitRoll::isSuccessMagic(pSlayer, pSkillInfo, pSkillSlot);		bool bEffected   = pSlayer->isFlag(Effect::EFFECT_CLASS_CROSS_COUNTER);		if (bManaCheck && bTimeCheck && bRangeCheck && bHitRoll && !bEffected)		{			decreaseMana(pSlayer, RequiredMP, _GCSkillToSelfOK1);					SkillInput input(pSlayer, pSkillSlot);			SkillOutput output;			computeOutput(input, output);			// 捞棋飘 努贰胶甫 父甸绢 嘿牢促.			EffectCrossCounter* pEffect = new EffectCrossCounter(pSlayer);			pEffect->setDeadline(output.Duration);			pSlayer->addEffect(pEffect);			pSlayer->setFlag(Effect::EFFECT_CLASS_CROSS_COUNTER);			// 版氰摹甫 棵赴促.			SkillGrade Grade = g_pSkillInfoManager->getGradeByDomainLevel(pSlayer->getSkillDomainLevel(DomainType));			Exp_t ExpUp = 10*(Grade+1);			if ( bIncreaseDomainExp )			{				shareAttrExp(pSlayer, ExpUp, 8, 1, 1, _GCSkillToSelfOK1);				increaseDomainExp(pSlayer, DomainType, pSkillInfo->getPoint(), _GCSkillToSelfOK1);				increaseSkillExp(pSlayer, DomainType, pSkillSlot, pSkillInfo, _GCSkillToSelfOK1);			}			// 菩哦阑 父甸绢 焊辰促.			_GCSkillToSelfOK1.setSkillType(SkillType);			_GCSkillToSelfOK1.setCEffectID(CEffectID);			_GCSkillToSelfOK1.setDuration(output.Duration);					_GCSkillToSelfOK2.setObjectID(pSlayer->getObjectID());			_GCSkillToSelfOK2.setSkillType(SkillType);			_GCSkillToSelfOK2.setDuration(output.Duration);			pZone->broadcastPacket(pSlayer->getX(), pSlayer->getY(),  &_GCSkillToSelfOK2, pSlayer);			pPlayer->sendPacket(&_GCSkillToSelfOK1);			// 捞棋飘啊 嘿菌促绊 舅妨霖促.			GCAddEffect gcAddEffect;			gcAddEffect.setObjectID(pSlayer->getObjectID());			gcAddEffect.setEffectID(Effect::EFFECT_CLASS_CROSS_COUNTER);			gcAddEffect.setDuration(output.Duration);			pZone->broadcastPacket(pSlayer->getX(), pSlayer->getY(), &gcAddEffect);			pSkillSlot->setRunTime(output.Delay);		} 		else 		{			executeSkillFailNormal(pSlayer, getSkillType(), NULL);		}	} 	catch (Throwable & t) 	{		executeSkillFailException(pSlayer, getSkillType());	}	//cout << "TID[" << Thread::self() << "]" << getSkillHandlerName() << " End(slayerself)" << endl;	__END_CATCH}//////////////////////////////////////////////////////////////////////////////// 农肺胶 墨款磐 眉农 窃荐// 农肺胶 墨款磐啊 惯悼登搁 true甫 府畔茄促.//////////////////////////////////////////////////////////////////////////////bool CheckCrossCounter(Creature* pAttacker, Creature* pTargetCreature, Damage_t damage, Range_t range){	__BEGIN_TRY	//cout << "CheckCrossCounter Begin" << endl;	Assert(pAttacker != NULL);	Assert(pTargetCreature != NULL);	// 浇饭捞绢父捞 捞 扁贱阑 镜 荐 乐绊, 弊 芭府绰 1捞绢具父 茄促.	if (pTargetCreature->isSlayer() == false || range != 1)	{		//cout << "CheckCrossCounter End" << endl;		return false;	}	bool bSuccess = false;		// 扁贱捞 吧妨乐绊, 泅犁 付厚 惑怕啊 酒聪扼搁...	if (pTargetCreature->isFlag(Effect::EFFECT_CLASS_CROSS_COUNTER) && !pTargetCreature->isFlag(Effect::EFFECT_CLASS_PARALYZE))	{		Slayer*           pTargetSlayer          = dynamic_cast<Slayer*>(pTargetCreature);		SkillSlot*        pCrossCounterSkillSlot = pTargetSlayer->hasSkill(SKILL_CROSS_COUNTER);		SkillInfo*        pSkillInfo             = g_pSkillInfoManager->getSkillInfo(SKILL_CROSS_COUNTER);		SkillDomainType_t DomainType             = pSkillInfo->getDomainType();		Zone*             pZone                  = pAttacker->getZone();		Assert(pTargetSlayer != NULL);		Assert(pCrossCounterSkillSlot != NULL);		Assert(pSkillInfo != NULL);		Assert(pZone != NULL);		Item* pWeapon = pTargetSlayer->getWearItem( Slayer::WEAR_RIGHTHAND );		if (!verifyDistance(pAttacker, pTargetCreature, 1) ||		// 八阑 甸绊 乐瘤 臼栏搁 惯悼登瘤 臼绰促. by Sequoia 2003.3.25			pWeapon == NULL || pWeapon->getItemClass() != Item::ITEM_CLASS_SWORD		)		{			return false;		}		// hitroll捞 己傍沁促搁...		if (HitRoll::isSuccess(pTargetSlayer, pAttacker) && canHit(pTargetSlayer, pAttacker, SKILL_CROSS_COUNTER))		{			// counter俊辑绰 			// pTargetSlayer啊 傍拜磊, pAttacker啊 傍拜寸窍绰 磊啊 等促.			ObjectID_t targetID   = pTargetSlayer->getObjectID();				ObjectID_t attackerID = pAttacker->getObjectID();						GCCrossCounterOK1 _GCCrossCounterOK1;			GCCrossCounterOK2 _GCCrossCounterOK2;			GCCrossCounterOK3 _GCCrossCounterOK3;			Level_t    SkillLevel  = pCrossCounterSkillSlot->getExpLevel();			SkillGrade Grade       = g_pSkillInfoManager->getGradeByDomainLevel(SkillLevel); 			////////////////////////////////////////////////////////////			// 胶懦 弊饭捞靛俊 蝶扼辑 促弗 扁贱捞 唱埃促.			// SKILL_GRADE_APPRENTICE			// SKILL_GRADE_ADEPT			// SKILL_GRADE_EXPERT			// SKILL_GRADE_MASTER			// SKILL_GRADE_GRAND_MASTER			////////////////////////////////////////////////////////////			SkillType_t CounterSkillType = SKILL_ATTACK_MELEE;            bool bCriticalHit;			// 扁夯 单固瘤俊 胶懦 单固瘤甫 歹茄促.			Damage_t Damage = computeDamage(pTargetSlayer, pAttacker, SkillLevel/5, bCriticalHit);			if (Grade == SKILL_GRADE_APPRENTICE) 			{				Damage += pTargetSlayer->getDamage(ATTR_CURRENT);			} 			else if (Grade == SKILL_GRADE_ADEPT) 			{				SkillInfo * pSkillInfo = g_pSkillInfoManager->getSkillInfo(SKILL_DOUBLE_IMPACT);				Damage_t SkillMinPoint = pSkillInfo->getMinDamage();				Damage_t SkillMaxPoint = pSkillInfo->getMaxDamage();				Damage += (int)(SkillMinPoint + (SkillMaxPoint - SkillMinPoint) * (double)(SkillLevel * 0.01));				CounterSkillType = SKILL_DOUBLE_IMPACT;			} 			else if (Grade == SKILL_GRADE_EXPERT) 			{				SkillInfo * pSkillInfo = g_pSkillInfoManager->getSkillInfo(SKILL_TRIPLE_SLASHER);				Damage_t SkillMinPoint = pSkillInfo->getMinDamage();				Damage_t SkillMaxPoint = pSkillInfo->getMaxDamage();				Damage += (int)(SkillMinPoint + (SkillMaxPoint - SkillMinPoint) * (double)(SkillLevel * 0.01));				CounterSkillType = SKILL_TRIPLE_SLASHER;			} 			else if (Grade == SKILL_GRADE_MASTER) 			{				SkillInfo * pSkillInfo = g_pSkillInfoManager->getSkillInfo(SKILL_THUNDER_SPARK);				Damage_t SkillMinPoint = pSkillInfo->getMinDamage();				Damage_t SkillMaxPoint = pSkillInfo->getMaxDamage();				Damage += (int)(SkillMinPoint + (SkillMaxPoint - SkillMinPoint) * (double)(SkillLevel * 0.01));				CounterSkillType = SKILL_THUNDER_SPARK;			} 			else if (Grade == SKILL_GRADE_GRAND_MASTER) 			{				SkillInfo * pSkillInfo = g_pSkillInfoManager->getSkillInfo(SKILL_RAINBOW_SLASHER);				Damage_t SkillMinPoint = pSkillInfo->getMinDamage();				Damage_t SkillMaxPoint = pSkillInfo->getMaxDamage();				Damage += (int)(SkillMinPoint + (SkillMaxPoint - SkillMinPoint) * (double)(SkillLevel * 0.01));				CounterSkillType = SKILL_RAINBOW_SLASHER;			}			_GCCrossCounterOK1.setSkillType(CounterSkillType);			_GCCrossCounterOK2.setSkillType(CounterSkillType);			_GCCrossCounterOK3.setSkillType(CounterSkillType);			if (Random(1, 100) < 60 && !pAttacker->isSlayer()) 			{				shareAttrExp(pTargetSlayer , Damage , 8, 1, 1, _GCCrossCounterOK1);				increaseDomainExp(pTargetSlayer, DomainType, pSkillInfo->getPoint(), _GCCrossCounterOK1);				increaseSkillExp(pTargetSlayer, DomainType, pCrossCounterSkillSlot, pSkillInfo, _GCCrossCounterOK1);			}			setDamage(pAttacker, Damage, pTargetCreature, SKILL_CROSS_COUNTER ,&_GCCrossCounterOK2, &_GCCrossCounterOK1);			//SkillHandler::computeAlignmentChange(pAttacker, Damage, pTargetCreature, &_GCCrossCounterOK2, &_GCCrossCounterOK1);			_GCCrossCounterOK1.setObjectID(attackerID);			_GCCrossCounterOK2.setObjectID(targetID);			_GCCrossCounterOK3.setObjectID(targetID);			_GCCrossCounterOK3.setTargetObjectID(attackerID);			pTargetSlayer->getPlayer()->sendPacket(&_GCCrossCounterOK1);			if (pAttacker->isPC())			{				pAttacker->getPlayer()->sendPacket(&_GCCrossCounterOK2);			}			else if (pAttacker->isMonster())			{                Monster * pMonster = dynamic_cast<Monster*>(pAttacker);				// 农肺胶墨款磐啊 惯悼登菌促绰 巴篮 阁胶磐啊 捞固 捞 浇饭捞绢甫 利栏肺 牢侥窍绊				// 傍拜阑 沁促绰 富捞骨肺, addEnemy甫 秦 临 鞘夸绰 绝促.				//pMonster->addEnemy(pTargetSlayer);				// 付胶磐绰 掉饭捞绝促.				if (!pMonster->isMaster()#ifdef __UNDERWORLD__						&& !pMonster->isUnderworld() && pMonster->getMonsterType() != 599#endif					)				{					Timeval NextTurn = pMonster->getNextTurn();					Timeval DelayTurn;					DelayTurn.tv_sec = 0;					DelayTurn.tv_usec = 200000;					Timeval NewTurn = NextTurn + DelayTurn;					pMonster->setNextTurn(NewTurn);				}			}			list<Creature*> cList;			cList.push_back(pTargetSlayer);			cList.push_back(pAttacker);			pZone->broadcastPacket(pTargetSlayer->getX(), pTargetSlayer->getY(), &_GCCrossCounterOK3, cList);			bSuccess = true;		}		else		{			// CrossCounter角菩窍搁 角菩菩哦 焊郴唱??		}	}	//cout << "CheckCrossCounter End" << endl;	return bSuccess;	__END_CATCH}CrossCounter g_CrossCounter;

⌨️ 快捷键说明

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