📄 skillutil.cpp
字号:
{ Vampire* pVampireAttacker = dynamic_cast<Vampire*>(pAttacker); Result2 = max(0, (int)pVampireAttacker->getHP()-(int)counterDamage); pVampireAttacker->setHP(Result2, ATTR_CURRENT); bBroadcastAttackerHP = true; bSendAttackerHP = true; // Mephisto 捞棋飘 吧妨乐栏搁 HP 30% 捞窍老锭 钱赴促. if (pVampireAttacker->isFlag(Effect::EFFECT_CLASS_MEPHISTO)) { HP_t maxHP = pVampireAttacker->getHP(ATTR_MAX); // 33% ... 纳纳.. if (Result2*3 < maxHP) { Effect* pEffect = pVampireAttacker->findEffect( Effect::EFFECT_CLASS_MEPHISTO ); if ( pEffect != NULL ) { pEffect->setDeadline(0); } else { pVampireAttacker->removeFlag(Effect::EFFECT_CLASS_MEPHISTO); }// pVampireAttacker->getEffectManager()->deleteEffect( Effect::EFFECT_CLASS_MEPHISTO ); } } } 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); // 阁胶磐啊 开 单固瘤甫 罐阑 版快俊档 箕橇角靛 静绊 傍拜罐篮 浇饭捞绢俊霸 快急鼻捞 林绢柳促. pMonsterAttacker->addPrecedence(pTarget->getName(), pTarget->getPartyID(), counterDamage); pMonsterAttacker->setLastHitCreatureClass(pTarget->getCreatureClass()); bBroadcastAttackerHP = true; if (pMonsterAttacker->getHP(ATTR_CURRENT)*3 < pMonsterAttacker->getHP(ATTR_MAX)) { PrecedenceTable* pTable = pMonsterAttacker->getPrecedenceTable(); // HP啊 3盒狼 1 捞窍牢 惑怕扼绊 公炼扒 拌魂阑 窍搁, // 概畔付促 狼固啊 绝绰 拌魂阑 拌加 窍霸 登骨肺, // 茄锅 拌魂阑 窍绊 唱搁, 磷扁 傈鳖瘤绰 促矫 拌魂窍瘤 臼档废 // 敲贰弊甫 技泼秦 霖促. 捞 敲贰弊甫 捞侩窍咯 鞘夸绝绰 拌魂阑 临牢促. if (pTable->getComputeFlag() == false) { // 拌魂阑 秦霖促. pTable->compute(); // 龋胶飘狼 捞抚苞 颇萍 ID甫 捞侩窍咯, 捞棋飘甫 吧绢霖促. EffectPrecedence* pEffectPrecedence = new EffectPrecedence(pMonsterAttacker); pEffectPrecedence->setDeadline(100); pEffectPrecedence->setHostName(pTable->getHostName()); pEffectPrecedence->setHostPartyID(pTable->getHostPartyID()); pMonsterAttacker->setFlag(Effect::EFFECT_CLASS_PRECEDENCE); pMonsterAttacker->addEffect(pEffectPrecedence); } } } } return Result2;}bool canBlockByWaterBarrier( SkillType_t SkillType ){ switch ( SkillType ) { case SKILL_METEOR_STRIKE: case SKILL_POISON_STORM: case SKILL_GREEN_POISON: case SKILL_GREEN_STALKER: case SKILL_ACID_STORM: case SKILL_ACID_BOLT: case SKILL_ACID_STRIKE: case SKILL_ACID_SWAMP: case SKILL_BLOODY_KNIFE: case SKILL_BLOODY_WAVE: case SKILL_BLOODY_STRIKE: case SKILL_BLOODY_BALL: case SKILL_BLOODY_WALL: case SKILL_BLOODY_SPEAR: case SKILL_WIND_DIVIDER: case SKILL_SWORD_RAY: case SKILL_WIDE_LIGHTNING: case SKILL_EARTHQUAKE: case SKILL_POWER_OF_LAND: case SKILL_MULTI_AMPUTATE: case SKILL_WILD_TYPHOON: case SKILL_ATTACK_ARMS: case SKILL_DOUBLE_SHOT: case SKILL_TRIPLE_SHOT: case SKILL_MULTI_SHOT: case SKILL_HEAD_SHOT: case SKILL_QUICK_FIRE: case SKILL_ULTIMATE_BLOW: case SKILL_PIERCING: case SKILL_THROW_BOMB: case SKILL_BULLET_OF_LIGHT: case SKILL_GUN_SHOT_GUIDANCE: case SKILL_HOLY_ARROW: case SKILL_CAUSE_LIGHT_WOUNDS: case SKILL_CAUSE_SERIOUS_WOUNDS: case SKILL_CAUSE_CRITICAL_WOUNDS: case SKILL_VIGOR_DROP: case SKILL_TURN_UNDEAD: case SKILL_ILLENDUE: case SKILL_THROW_HOLY_WATER: case SKILL_LIGHT_BALL: case SKILL_AURA_BALL: case SKILL_AURA_RING: case SKILL_ENERGY_DROP: case SKILL_REBUKE: case SKILL_SPIRIT_GUARD: case SKILL_KASAS_ARROW: case SKILL_PROMINENCE: case SKILL_RING_OF_FLARE: case SKILL_BLAZE_BOLT: case SKILL_HANDS_OF_NIZIE: case SKILL_STONE_AUGER: case SKILL_EARTHS_TEETH: return true; default: return false; }}bool canBlockByGrayDarkness( SkillType_t skillType ){ switch( skillType ) { case SKILL_SWORD_WAVE: case SKILL_SWORD_RAY: case SKILL_WIND_DIVIDER: case SKILL_THUNDER_BOLT: case SKILL_THUNDER_STORM: case SKILL_WIDE_LIGHTNING: case SKILL_TORNADO_SEVER: case SKILL_EARTHQUAKE: case SKILL_POWER_OF_LAND: case SKILL_WILD_TYPHOON: case SKILL_MULTI_SHOT: case SKILL_MOLE_SHOT: case SKILL_GUN_SHOT_GUIDANCE: case SKILL_VIGOR_DROP: case SKILL_TURN_UNDEAD: case SKILL_ENERGY_DROP: return true; default: return false; }}bool canGiveSkillExp( Slayer* pSlayer, SkillDomainType_t SkillDomainType, SkillType_t UseSkillType ){ if ( pSlayer == NULL ) return false; if ( !pSlayer->isRealWearing( Slayer::WEAR_RIGHTHAND ) ) return false; Item* pWeapon = pSlayer->getWearItem( Slayer::WEAR_RIGHTHAND ); if ( pWeapon == NULL ) return false; switch ( SkillDomainType ) { case SKILL_DOMAIN_BLADE: if ( pWeapon->getItemClass() != Item::ITEM_CLASS_BLADE ) return false; break; case SKILL_DOMAIN_SWORD: if ( pWeapon->getItemClass() != Item::ITEM_CLASS_SWORD ) return false; break; case SKILL_DOMAIN_GUN: if ( !isArmsWeapon( pWeapon ) ) return false; break; case SKILL_DOMAIN_HEAL: if ( pWeapon->getItemClass() != Item::ITEM_CLASS_CROSS ) return false; break; case SKILL_DOMAIN_ENCHANT: if ( pWeapon->getItemClass() != Item::ITEM_CLASS_MACE ) return false; break; default: return false; } if ( UseSkillType < SKILL_DOUBLE_IMPACT ) return true; SkillInfo* pUseSkillInfo = g_pSkillInfoManager->getSkillInfo( UseSkillType ); if ( SkillDomainType != pUseSkillInfo->getDomainType() ) return false; return true;}void giveSkillExp( Slayer* pSlayer, SkillType_t SkillType, ModifyInfo& AttackerMI ){ if ( pSlayer == NULL ) return; SkillSlot* pSkillSlot = pSlayer->getSkill( SkillType ); SkillInfo* pSkillInfo = g_pSkillInfoManager->getSkillInfo( SkillType ); if ( pSkillSlot != NULL && pSkillInfo != NULL ) { //cout << pSlayer->getName() << "俊霸 " << pSkillInfo->getName() << "胶懦狼 版氰摹甫 凛聪促." << endl; increaseSkillExp(pSlayer, pSkillInfo->getDomainType(), pSkillSlot, pSkillInfo, AttackerMI); }}//////////////////////////////////////////////////////////////////////////////// 流立利栏肺 单固瘤甫 技泼茄促.//////////////////////////////////////////////////////////////////////////////HP_t setDamage(Creature* pTargetCreature, Damage_t Damage, Creature* pAttacker, SkillType_t SkillType, ModifyInfo* pMI, ModifyInfo* pAttackerMI, bool canKillTarget){ Assert(pTargetCreature != NULL); if (pTargetCreature->isFlag(Effect::EFFECT_CLASS_NO_DAMAGE) || pTargetCreature->isFlag(Effect::EFFECT_CLASS_TENDRIL) || pTargetCreature->isDead()) { //if (pTargetCreature->isVampire()) // return蔼栏肺 泅犁 HP甫 逞败拎具 沥惑捞摆瘤父 // return蔼阑 荤侩窍绰 何盒捞 绝绢辑 老窜 公矫茄促. // by sigi. 2002.9.5 return 0; }// bool canKillTarget = (SkillType==SKILL_ACID_SWAMP)?false:true; Zone* pZone = pTargetCreature->getZone(); Assert(pZone != NULL); HP_t Result = 0; HP_t Result2 = 0; HP_t hp = 0; MP_t mp = 0; ZoneCoord_t TX = 0; ZoneCoord_t TY = 0; ObjectID_t TOID = 0; ZoneCoord_t AX = 0; ZoneCoord_t AY = 0; ObjectID_t AOID = 0; Damage_t OriginalDamage = Damage; bool bBroadcastTargetHP = false; // 乔傍拜磊狼 HP甫 宏肺靛某胶泼窍唱? bool bSendTargetHP = false; // 乔傍拜磊狼 HP甫 焊郴林唱? bool bSendTargetMP = false; // 乔傍拜磊狼 MP甫 焊郴林唱? bool bBroadcastAttackerHP = false; // 傍拜磊狼 HP甫 宏肺靛某胶泼窍唱? bool bSendAttackerHP = false; // 傍拜磊狼 HP甫 焊郴林唱? bool bSendAttackerMP = false; // 傍拜磊狼 MP甫 焊郴林唱? GCStatusCurrentHP gcTargetHP; GCStatusCurrentHP gcAttackerHP; SkillProperty* pSkillProperty = g_pSkillPropertyManager->getSkillProperty( SkillType ); // 酒付霸捣 捞棋飘啊 吧妨乐阑 版快 荐沥备浇(?)狼 HP甫 别酒林绊 鸥百篮 傍拜罐瘤 臼绰促. // SKILL_ARMAGEDDON老 版快 酒付霸捣 捞棋飘 磊眉狼 单固瘤捞骨肺 弊成 鸥百阑 傍拜窍绰 率栏肺 逞绢埃促. /* if( pTargetCreature != NULL && pTargetCreature->isFlag( Effect::EFFECT_CLASS_ARMAGEDDON ) && SkillType != SKILL_ARMAGEDDON ) { EffectArmageddon* pEffect = dynamic_cast<EffectArmageddon*>(pTargetCreature->findEffect(Effect::EFFECT_CLASS_ARMAGEDDON)); Assert( pEffect != NULL ); Damage = computePureDamage( pAttacker ); pEffect->decreaseHP( Damage ); if ( pTargetCreature->isSlayer() ) { Slayer* pSlayer = dynamic_cast<Slayer*>(pTargetCreature); Result = pSlayer->getHP( ATTR_CURRENT ); } else if ( pTargetCreature->isVampire() ) { Vampire* pVampire = dynamic_cast<Vampire*>(pTargetCreature); Result = pVampire->getHP( ATTR_CURRENT ); } else if ( pTargetCreature->isMonster() ) { Monster* pMonster = dynamic_cast<Monster*>(pTargetCreature); Result = pMonster->getHP( ATTR_CURRENT ); } return Result; } */ if ( pTargetCreature != NULL && pTargetCreature->isMonster() ) { Monster* pMonster = dynamic_cast<Monster*>(pTargetCreature); if ( pMonster != NULL && pMonster->getMonsterType() == GROUND_ELEMENTAL_TYPE ) if ( pAttacker != NULL && pAttacker->isOusters() ) return 0; } // 胶飘扼捞欧捞 吧妨乐栏搁 付过 单固瘤 唤脾扁 if ( pAttacker != NULL && pSkillProperty->isMagic() && pAttacker->isFlag( Effect::EFFECT_CLASS_STRIKING ) ) { EffectStriking* pEffect = dynamic_cast<EffectStriking*>(pAttacker->findEffect( Effect::EFFECT_CLASS_STRIKING )); if ( pEffect != NULL ) { Damage += pEffect->getDamageBonus(); } } // Denial Magic 捞 吧妨乐阑 版快 付过单固瘤牢瘤 眉农秦辑 硅虏促. if ( pTargetCreature != NULL && pTargetCreature->isFlag( Effect::EFFECT_CLASS_DENIAL_MAGIC ) && pSkillProperty->isMagic() ) { // 扁夯胶懦篮 SkillInfo 啊 绝促. if ( SkillType >= SKILL_DOUBLE_IMPACT ) { SkillInfo* pSkillInfo = g_pSkillInfoManager->getSkillInfo(SkillType); Assert(pSkillInfo != NULL); // 轨颇捞绢狼 付过单固瘤父 阜酒霖促. if ( pSkillInfo->getDomainType() == SKILL_DOMAIN_VAMPIRE || pSkillInfo->getDomainType() == SKILL_DOMAIN_OUSTERS ) { // 己傍利栏肺 阜疽阑 版快 捞棋飘甫 岗瘤霸 朝妨霖促. GCAddEffect gcAddEffect; gcAddEffect.setObjectID( pTargetCreature->getObjectID() ); gcAddEffect.setEffectID( Effect::EFFECT_CLASS_DENIAL_MAGIC_DAMAGED ); gcAddEffect.setDuration(0); pTargetCreature->getZone()->broadcastPacket( pTargetCreature->getX(), pTargetCreature->getY(), &gcAddEffect );// return 0; // 硅掳瘤 富绊 单固瘤 60%...... ぬ.ば Damage = max( 1, (int)(Damage * 0.4) ); } } } // Water Barrier 啊 吧妨乐阑 版快 醚浇 傍拜俊 措秦辑父 单固瘤甫 临咯霖促. if ( pTargetCreature != NULL && pTargetCreature->isFlag( Effect::EFFECT_CLASS_WATER_BARRIER ) && !pSkillProperty->isMelee() ) { // 扁夯胶懦篮 SkillInfo 啊 绝促. if ( canBlockByWaterBarrier( SkillType ) ) { EffectWaterBarrier* pEWB = dynamic_cast<EffectWaterBarrier*>(pTargetCreature->findEffect(Effect::EFFECT_CLASS_WATER_BARRIER)); if ( pEWB != NULL ) { int bonus = pEWB->getBonus(); if ( bonus > 100 ) bonus = 100; Damage = (Damage_t)(Damage * ((float)(100-bonus) / 100.0)); Damage = max( 1, (int)Damage ); } } } // Water Shield 啊 吧副 荐 乐绰 版快 拱府 傍拜俊 措秦辑绰 单固瘤甫 林瘤 臼绰促 if ( pTargetCreature != NULL && pSkillProperty->isPhysic() ) { if ( pTargetCreature->isOusters() ) { Ousters* pOusters = dynamic_cast<Ousters*>(pTargetCreature); if ( pOusters->isPassiveAvailable(SKILL_WATER_SHIELD) ) { if ( (rand()%100) < min(20, (int)(pOusters->getPassiveRatio() * 3/2)) ) { GCAddEffect gcAddEffect; gcAddEffect.setObjectID( pOusters->getObjectID() ); gcAddEffect.setEffectID( Effect::EFFECT_CLASS_WATER_SHIELD ); gcAddEffect.setDuration( 0 ); pZone->broadcastPacket( pOusters->getX(), pOusters->getY(), &gcAddEffect ); //cout << "况磐角靛 惯悼沁嚼聪促." << endl; return 0; } } } } if ( pTargetCreature != NULL && pTargetCreature->isFlag( Effect::EFFECT_CLASS_STONE_SKIN ) && ( SkillType >= SKILL_DOUBLE_IMPACT || SkillType == SKILL_ATTACK_ARMS ) ) { if ( SkillType == SKILL_ATTACK_ARMS || g_pSkillInfoManager->getSkillInfo( SkillType )->getDomainType() == SKILL_DOMAIN_GUN ) { EffectStoneSkin* pStoneSkin = dynamic_cast<EffectStoneSkin*>(pTargetCreature->findEffect( Effect::EFFECT_CLASS_STONE_SKIN )); if ( pStoneSkin != NULL ) { if ( (rand()%100) < pStoneSkin->getBonus() )
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -