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

📄 skillutil.cpp

📁 天之炼狱1服务器端源文件游戏服务端不完整
💻 CPP
📖 第 1 页 / 共 5 页
字号:
				{					Damage = 0;					GCAddEffect gcAddEffect;					gcAddEffect.setObjectID( pTargetCreature->getObjectID() );					gcAddEffect.setEffectID( Effect::EFFECT_CLASS_STONE_SKIN_DAMAGED );					gcAddEffect.setDuration(0);					pTargetCreature->getZone()->broadcastPacket( pTargetCreature->getX(), pTargetCreature->getY(), &gcAddEffect );				}			}		}	}	if ( pAttacker != NULL 		&& pAttacker->isOusters() 		&& SkillType >= SKILL_DOUBLE_IMPACT	)	{		Ousters* pOusters = dynamic_cast<Ousters*>(pAttacker);		Assert(pOusters != NULL);		SkillInfo* pSkillInfo = g_pSkillInfoManager->getSkillInfo(SkillType);		Assert(pSkillInfo != NULL);		if ( pSkillProperty->isMagic() )		{			switch ( pSkillInfo->getElementalDomain() )			{				case ELEMENTAL_DOMAIN_FIRE:					Damage += pOusters->getFireDamage();					//cout << "FireDamage利侩 : " << pOusters->getFireDamage() <<"," <<Damage << endl;;					if ( pOusters->isFlag( Effect::EFFECT_CLASS_HANDS_OF_FIRE ) )					{						EffectHandsOfFire* pEffect = dynamic_cast<EffectHandsOfFire*>(pOusters->findEffect( Effect::EFFECT_CLASS_HANDS_OF_FIRE ));						if ( pEffect != NULL )						{							Damage = (Damage_t)(Damage * ( 1.0 + ( pEffect->getBonus() / 100.0 ) ));						}					}					break;				case ELEMENTAL_DOMAIN_WATER:					Damage += pOusters->getWaterDamage();					break;				case ELEMENTAL_DOMAIN_EARTH:					Damage += pOusters->getEarthDamage();					break;				default:					break;			}		}	}	if (pTargetCreature != NULL)	{		TX   = pTargetCreature->getX();		TY   = pTargetCreature->getY();		TOID = pTargetCreature->getObjectID();		gcTargetHP.setObjectID(TOID);	}	////////////////////////////////////////////////////////////////////	// Target Creature 俊 捞棋飘甫 贸府茄促.	////////////////////////////////////////////////////////////////////	if ( pTargetCreature != NULL )	{		// SLEEP 捞棋飘啊 吧妨 乐促搁 捞棋飘甫 昏力茄促.		if ( pTargetCreature->isFlag( Effect::EFFECT_CLASS_SLEEP ) && SkillType != SKILL_REBUKE )		{			EffectSleep* pEffect = dynamic_cast<EffectSleep*>(pTargetCreature->findEffect( Effect::EFFECT_CLASS_SLEEP ));			Assert( pEffect != NULL );			pEffect->setDeadline(0);		}	}	if (pAttacker != NULL)	{		AX   = pAttacker->getX();		AY   = pAttacker->getY();		AOID = pAttacker->getObjectID();		gcAttackerHP.setObjectID(AOID);		// 攫哩啊 弥利拳甫 窍霸 等促搁.. -_-;		// Creature俊促啊 Penalty包访 member甸阑 持绰霸 唱阑 巴捞促.		// Hymn吧妨乐促搁 damage penalty% 罐绰促.		if (pAttacker->isFlag(Effect::EFFECT_CLASS_HYMN))		{			EffectHymn* pHymn = dynamic_cast<EffectHymn*>( pAttacker->getEffectManager()->findEffect( Effect::EFFECT_CLASS_HYMN ));			Damage = Damage*(100-pHymn->getDamagePenalty())/100;		}		if ( pAttacker->isSlayer() && pAttackerMI != NULL && !pTargetCreature->isSlayer() )		{			Slayer* pAttackSlayer = dynamic_cast<Slayer*>(pAttacker);			Assert( pAttackSlayer != NULL );			// 伎橇胶懦甸 版氰摹 林扁 --;;			if ( canGiveSkillExp( pAttackSlayer, SKILL_DOMAIN_SWORD, SkillType ) )			{				if ( pAttackSlayer->isFlag( Effect::EFFECT_CLASS_DANCING_SWORD ) && (rand()%2)!=0 ) giveSkillExp( pAttackSlayer, SKILL_DANCING_SWORD, *pAttackerMI );				if ( pAttackSlayer->isFlag( Effect::EFFECT_CLASS_REDIANCE ) && (rand()%2)!=0 ) giveSkillExp( pAttackSlayer, SKILL_REDIANCE, *pAttackerMI );				if ( pAttackSlayer->isFlag( Effect::EFFECT_CLASS_EXPANSION ) && (rand()%2)!=0 ) giveSkillExp( pAttackSlayer, SKILL_EXPANSION, *pAttackerMI );			}			else if ( canGiveSkillExp( pAttackSlayer, SKILL_DOMAIN_BLADE, SkillType ) )			{				if ( pAttackSlayer->isFlag( Effect::EFFECT_CLASS_GHOST_BLADE ) && (rand()%2)!=0 ) giveSkillExp( pAttackSlayer, SKILL_GHOST_BLADE, *pAttackerMI );				if ( pAttackSlayer->isFlag( Effect::EFFECT_CLASS_POTENTIAL_EXPLOSION ) && (rand()%2)!=0 ) giveSkillExp( pAttackSlayer, SKILL_POTENTIAL_EXPLOSION, *pAttackerMI );				if ( pAttackSlayer->isFlag( Effect::EFFECT_CLASS_CHARGING_POWER ) && (rand()%2)!=0 ) giveSkillExp( pAttackSlayer, SKILL_CHARGING_POWER, *pAttackerMI );				if ( pAttackSlayer->isFlag( Effect::EFFECT_CLASS_BERSERKER ) && (rand()%2)!=0 ) giveSkillExp( pAttackSlayer, SKILL_BERSERKER, *pAttackerMI );				if ( pAttackSlayer->isFlag( Effect::EFFECT_CLASS_AIR_SHIELD_1 ) && (rand()%2)!=0 ) giveSkillExp( pAttackSlayer, SKILL_AIR_SHIELD, *pAttackerMI );			}			else if ( canGiveSkillExp( pAttackSlayer, SKILL_DOMAIN_GUN, SkillType ) )			{				if ( pAttackSlayer->isFlag( Effect::EFFECT_CLASS_CONCEALMENT ) && (rand()%2)!=0 ) giveSkillExp( pAttackSlayer, SKILL_CONCEALMENT, *pAttackerMI );				if ( pAttackSlayer->isFlag( Effect::EFFECT_CLASS_REVEALER ) && (rand()%2)!=0 ) giveSkillExp( pAttackSlayer, SKILL_REVEALER, *pAttackerMI );				if ( pAttackSlayer->isFlag( Effect::EFFECT_CLASS_OBSERVING_EYE ) && (rand()%2)!=0 ) giveSkillExp( pAttackSlayer, SKILL_OBSERVING_EYE, *pAttackerMI );				if ( pAttackSlayer->isFlag( Effect::EFFECT_CLASS_HEART_CATALYST ) && (rand()%2)!=0 ) giveSkillExp( pAttackSlayer, SKILL_HEART_CATALYST, *pAttackerMI );			}			else if ( canGiveSkillExp( pAttackSlayer, SKILL_DOMAIN_ENCHANT, SkillType ) )			{				if ( pAttackSlayer->isFlag( Effect::EFFECT_CLASS_AURA_SHIELD ) && (rand()%2)!=0 ) giveSkillExp( pAttackSlayer, SKILL_AURA_SHIELD, *pAttackerMI );			}/*			if (pAttacker->isFlag(Effect::EFFECT_CLASS_REDIANCE) && pAttacker->isSlayer() && pAttackerMI != NULL && !pTargetCreature->isSlayer())			{				EffectRediance* pEffect = dynamic_cast<EffectRediance*>( pAttacker->findEffect(Effect::EFFECT_CLASS_REDIANCE) );				if ( pEffect != NULL && pEffect->canGiveExp())				{					Slayer* pSlayer = dynamic_cast<Slayer*>(pAttacker);					Assert( pSlayer != NULL );					SkillSlot* pSkillSlot = pSlayer->getSkill( SKILL_REDIANCE );					SkillInfo* pSkillInfo = g_pSkillInfoManager->getSkillInfo( SKILL_REDIANCE );					if ( pSkillSlot != NULL && pSkillInfo != NULL )					{						increaseSkillExp(pSlayer, SKILL_DOMAIN_SWORD,  pSkillSlot, pSkillInfo, *pAttackerMI);					}				}			}			if (pAttacker->isFlag(Effect::EFFECT_CLASS_EXPANSION) && pAttacker->isSlayer() && pAttackerMI != NULL && !pTargetCreature->isSlayer())			{				Effect* pEffect = pAttacker->findEffect(Effect::EFFECT_CLASS_EXPANSION);				if ( pEffect != NULL && (rand()%2)==1 )				{					Slayer* pSlayer = dynamic_cast<Slayer*>(pAttacker);					Assert( pSlayer != NULL );					SkillSlot* pSkillSlot = pSlayer->getSkill( SKILL_EXPANSION );					SkillInfo* pSkillInfo = g_pSkillInfoManager->getSkillInfo( SKILL_EXPANSION );					if ( pSkillSlot != NULL && pSkillInfo != NULL )					{						increaseSkillExp(pSlayer, SKILL_DOMAIN_SWORD,  pSkillSlot, pSkillInfo, *pAttackerMI);					}				}			}			if (pAttacker->isFlag(Effect::EFFECT_CLASS_GHOST_BLADE) && pAttacker->isSlayer() && pAttackerMI != NULL && !pTargetCreature->isSlayer())			{				Effect* pEffect = pAttacker->findEffect(Effect::EFFECT_CLASS_GHOST_BLADE);				if ( pEffect != NULL && (rand()%2)==1 )				{					Slayer* pSlayer = dynamic_cast<Slayer*>(pAttacker);					Assert( pSlayer != NULL );					SkillSlot* pSkillSlot = pSlayer->getSkill( SKILL_GHOST_BLADE );					SkillInfo* pSkillInfo = g_pSkillInfoManager->getSkillInfo( SKILL_GHOST_BLADE );					if ( pSkillSlot != NULL && pSkillInfo != NULL )					{						increaseSkillExp(pSlayer, SKILL_DOMAIN_BLADE,  pSkillSlot, pSkillInfo, *pAttackerMI);					}				}			}*/		}		// Blood Bible 焊呈胶甫 利侩茄促.		if ( pAttacker->isPC() )		{			PlayerCreature* pPC = dynamic_cast<PlayerCreature*>(pAttacker);			Damage_t MagicBonusDamage = pPC->getMagicBonusDamage();			Damage_t PhysicBonusDamage = pPC->getPhysicBonusDamage();			if ( MagicBonusDamage != 0 && pSkillProperty!= NULL && pSkillProperty->isMagic() )			{				Damage += MagicBonusDamage;			}			if ( PhysicBonusDamage != 0 && pSkillProperty!= NULL && pSkillProperty->isPhysic() )			{				Damage += PhysicBonusDamage;			}		}	}	////////////////////////////////////////////////////////////	// 刚历 hp, mp steal阑 贸府茄促.	////////////////////////////////////////////////////////////	if (pAttacker != NULL && SkillType != SKILL_PROMINENCE && SkillType != SKILL_HELLFIRE)	{		Steal_t HPStealAmount = pAttacker->getHPStealAmount();		Steal_t MPStealAmount = pAttacker->getMPStealAmount();		// HP 胶瓶阑 眉农茄促.		if (HPStealAmount != 0 && (rand()%100) < pAttacker->getHPStealRatio())		{			if (pAttacker->isSlayer())			{				if ( pAttacker->isAlive() )				{					Slayer* pSlayer = dynamic_cast<Slayer*>(pAttacker);					// 泅犁狼 HP俊促 胶瓶茄 剧阑 歹窍绊, 					// 钙胶甫 逞瘤绰 臼绰瘤 眉农甫 茄促.					hp = pSlayer->getHP(ATTR_CURRENT) + (int)HPStealAmount;					hp = min(hp, pSlayer->getHP(ATTR_MAX));					// HP甫 技泼窍绊, 敲贰弊甫 囊促.					pSlayer->setHP(hp, ATTR_CURRENT);					bBroadcastAttackerHP = true;					bSendAttackerHP      = true;				}			}			else if (pAttacker->isVampire())			{				Vampire* pVampire = dynamic_cast<Vampire*>(pAttacker);				// 泅犁狼 HP俊促 胶瓶茄 剧阑 歹窍绊, 				// 钙胶甫 逞瘤绰 臼绰瘤 眉农甫 茄促.				hp = pVampire->getHP(ATTR_CURRENT) + (int)HPStealAmount;				hp = min(hp, pVampire->getHP(ATTR_MAX));				// HP甫 技泼窍绊, 敲贰弊甫 囊促.				pVampire->setHP(hp, ATTR_CURRENT);				bBroadcastAttackerHP = true;				bSendAttackerHP      = true;			}			else if (pAttacker->isOusters())			{				// 磷篮逞 HP棵妨林瘤富磊				if ( pAttacker->isAlive() )				{					Ousters* pOusters = dynamic_cast<Ousters*>(pAttacker);					// 泅犁狼 HP俊促 胶瓶茄 剧阑 歹窍绊, 					// 钙胶甫 逞瘤绰 臼绰瘤 眉农甫 茄促.					//cout << "HP Steal!" << (int)HPStealAmount << endl;					hp = pOusters->getHP(ATTR_CURRENT) + (int)HPStealAmount;					hp = min(hp, pOusters->getHP(ATTR_MAX));					// HP甫 技泼窍绊, 敲贰弊甫 囊促.					pOusters->setHP(hp, ATTR_CURRENT);					bBroadcastAttackerHP = true;					bSendAttackerHP      = true;				}			}			else Assert(false);		}		// MP 胶瓶阑 眉农茄促.		if (MPStealAmount != 0 && (rand()%100) < pAttacker->getMPStealRatio())		{			// 浇饭捞绢客 酒快胶磐胶老 版快 MP 胶瓶阑 贸府茄促.			if (pAttacker->isSlayer())			{				Slayer* pSlayer = dynamic_cast<Slayer*>(pAttacker);				// 泅犁狼 MP俊促 胶瓶茄 剧阑 歹窍绊, 				// 钙胶甫 逞瘤绰 臼绰瘤 眉农甫 茄促.				mp = pSlayer->getMP(ATTR_CURRENT) + (int)MPStealAmount;				mp = min(mp, pSlayer->getMP(ATTR_MAX));				pSlayer->setMP(mp, ATTR_CURRENT);				bSendAttackerMP = true;			}			else if (pAttacker->isOusters())			{				Ousters* pOusters = dynamic_cast<Ousters*>(pAttacker);				// 泅犁狼 MP俊促 胶瓶茄 剧阑 歹窍绊, 				// 钙胶甫 逞瘤绰 臼绰瘤 眉农甫 茄促.				mp = pOusters->getMP(ATTR_CURRENT) + (int)MPStealAmount;				mp = min(mp, pOusters->getMP(ATTR_MAX));				pOusters->setMP(mp, ATTR_CURRENT);				bSendAttackerMP = true;			}		}	}	if ( pTargetCreature != NULL && pTargetCreature->isFlag( Effect::EFFECT_CLASS_EXPLOSION_WATER ) )	{		EffectExplosionWater* pEffect = dynamic_cast<EffectExplosionWater*>(pTargetCreature->findEffect( Effect::EFFECT_CLASS_EXPLOSION_WATER ));		if ( pEffect != NULL )		{			int ratio = 100;			ratio -= pEffect->getDamageReduce();			if ( ratio < 0 ) ratio = 0;			Damage = max(1,getPercentValue( Damage, ratio ));		}	}	////////////////////////////////////////////////////////////	// 嘎绰 仇捞 浇饭捞绢老 版快	////////////////////////////////////////////////////////////	if (pTargetCreature->isSlayer())	{		// 酒快胶磐令啊 轨颇捞绢甫 磷牢 版快		Slayer* pSlayer = dynamic_cast<Slayer *>(pTargetCreature);		bool bSetDamage = false;		if ( pSlayer->isFlag(Effect::EFFECT_CLASS_REQUITAL) && pAttacker != NULL && pSkillProperty != NULL && pSkillProperty->isMelee() )		{			EffectRequital* pEffectRequital = (EffectRequital*)(pSlayer->findEffect(Effect::EFFECT_CLASS_REQUITAL));			int refl = pEffectRequital->getReflection();			Damage_t counterDamage = max(1, getPercentValue(Damage, refl));			Result2 = setCounterDamage( pAttacker, pSlayer, counterDamage, bBroadcastAttackerHP, bSendAttackerHP );		}		// AuraShield 瓤苞肺 HP措脚 MP啊 家葛登绰 版快啊 乐促.		// 付胶磐 饭绢俊辑 哆绰 弊扼款靛 绢琶(顶俊辑 脾绢唱坷绰 阂扁嫡) 嘎栏搁 坷扼角靛 公矫窍绊 HP 粹霸 茄促. 2003. 1.16. Sequoia		if (pSlayer->isFlag(Effect::EFFECT_CLASS_AURA_SHIELD) && SkillType != SKILL_GROUND_ATTACK )		{			// 傍拜磊俊霸 单固瘤甫 倒妨拎具 茄促.			if (pAttacker != NULL)			{				Damage_t counterDamage = 0;				EffectAuraShield* pEffectAuraShield = (EffectAuraShield*)(pSlayer->findEffect(Effect::EFFECT_CLASS_AURA_SHIELD));				Assert(pEffectAuraShield != NULL);				// 墨款磐 单固瘤绰 盔贰 单固瘤狼 10盒狼 1捞促.				counterDamage = max(1, getPercentValue(Damage, 10));				if (pAttacker->isVampire())				{					Vampire* pVampireAttacker = dynamic_cast<Vampire*>(pAttacker);					Result2 = max(0, (int)pVampireAttacker->getHP()-(int)counterDamage); 					pVampireAttacker->setHP(Result2, ATTR_CURRENT);					bBroadcastAttackerHP = true;					bSendAttackerHP      = true;				}				else if (pAttacker->isOusters())				{					Ousters* pOustersAttacker = dynamic_cast<Ousters*>(pAttacker);					Result2 = max(0, (int)pOustersAttacker->getHP()-(int)counterDamage); 					pOustersAttacker->setHP(Result2, ATTR_CURRENT);					bBroadcastAttackerHP = true;					bSendAttackerHP      = true;				}				else if (pAttacker->isMonster())				{					Monster* pMonsterAttacker = dynamic_cast<Monster*>(pAttacker);					Result2 = max(0, (int)pMonsterAttacker->getHP()-(int)counterDamage); 					pMonsterAttacker->setHP(Result2, ATTR_CURRENT);					pMonsterAttacker->setDamaged(true);					bBroadcastAttackerHP = true;				}			}#ifdef __CHINA_SERVER__			Result = max(0, (int)pSlayer->getMP(ATTR_CURRENT) - (int)(Damage*2.5));#else			Result = max(0, (int)pSlayer->getMP(ATTR_CURRENT) - (int)(Damage*2));#endif			pSlayer->setMP(Result, ATTR_CURRENT);			bSendTargetMP = true;			// Result啊 0牢 版快, 付唱啊 促 粹疽窜 富捞促.			// 弊矾骨肺 effect甫 昏力秦 霖促.			if (Result == 0)			{				pSlayer->deleteEffect(Effect::EFFECT_CLASS_AURA_SHIELD);				pSlayer->removeFlag(Effect::EFFECT_CLASS_AURA_SHIELD);				GCRemoveEffect removeEffect;				removeEffect.setObjectID(TOID);				removeEffect.addEffectList(Effect::EFFECT_CLASS_AURA_SHIELD);				pZone->broadcastPacket(TX, TY, &removeEffect);				// 扁贱阑 促矫 镜 荐 乐档废 扁贱 掉饭捞甫 朝妨霖促.				SkillSlot* pSkillSlot = pSlayer->hasSkill(SKILL_AURA_SHIELD);				if ( pSkillSlot != NULL )				{					pSkillSlot->setRunTime( 0, false );				}			}				bSetDamage = true;		}		// by Sequoia 2002.12.26		// Melee 绢

⌨️ 快捷键说明

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