📄 skillutil.cpp
字号:
{ 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 + -